原因:当我们使用Shiro发送AJAX请求的时候,会自动跳转页面(而AJAX不能@R_532_404@面,添砖会出很多错误)
因为是shiro自己的原因,所以我们需要使用我们自己定义的
在shiro中使用这个类PermissionsAuthorizationFilter来过滤请求所以覆写
AJAX特点
普通请求
AJAX
所以我们可以通过七种不同来判断是否为AJAX请求
写一个类继承PermissionsAuthorizationFilter
packagecn.jiedada.aisell.web.shiro;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.StringUtils;importorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;importorg.apache.shiro.web.util.WebUtils;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;/*** 写一个自己的Shiro来判断出我们需要的东西处理Ajax权限*/
public class AisellPermissionsAuthorizationFilter extendsPermissionsAuthorizationFilter {
@Overrideprotected boolean onAccessDenied(ServletRequest request,ServletResponse response) throwsIOException {
Subject subject= this.getSubject(request,response);//判断用户是否登陆
if (subject.getPrincipal() == null) {this.saveRequestAndRedirectToLogin(request,response);
}else{//只用通过HttpServletRequest才能获得请求头中的数据才能判断
HttpServletRequest httpRequest =(HttpServletRequest) request;
HttpServletResponse httpResponse=(HttpServletResponse)response;//查看是否是AjAX请求
String xRequested = httpRequest.getHeader("X-Requested-With");if(xRequested!=null&&"XMLHttpRequest".equals(xRequested)){//传入前需要在请求头中传入响应,让他知道我们返回的数据是AJAX请求
httpResponse.setContentType("text/json; charset=UTF-8");//带回AJAX请求,把数据作为流传回去这里需要传出标准的json数据格式
httpResponse.getWriter().print( "{\"success\":false,\"msg\":\"没有权限\"}");
}else{
String unauthorizedUrl= this.getUnauthorizedUrl();if(StringUtils.hasText(unauthorizedUrl)) {
WebUtils.issueRedirect(request,response,unauthorizedUrl);
}else{
WebUtils.toHttp(response).sendError(401);
}
}
}return false;
}
}
View Code
把application-shiro.xml中默认的配置设置为我们自己的配置
View Code
其实就是这一句
然后需要把我们shrio中默认的值改为aisellPers这个为我们上面的key值
List permissions =permissionService.findAll();
permissions.forEach(p->{
map.put(p.getUrl(),"aisellPers["+p.getSn()+"]");
});