引入
原因
shiro只支持普通请求
我们怎么去修改shiro权限拦截
解决
去扩展PermissionsAuthorizationFilter,我们选择继承他因为其中的很多方法我们可以直接使用而不用修改,需要修改的是当执行错误返回数据的那个方法(因为在原方法中它是只支持普通请求而无法对ajax请求作出处理的)
自定义权限过滤器
/**
* 自定义权限过滤器
*
* @author myllxy
* @create 2019-12-17 18:51
*/
public class AisellAuthorizationFilter extends PermissionsAuthorizationFilter {
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
Subject subject = getSubject(request, response);
if (subject.getPrincipal() == null) {
saveRequestAndRedirectToLogin(request, response);
} else {
/*
<!--如果你没有权限,你会进入这个页面-->
<property name="unauthorizedUrl" value="/s/unauthorized.jsp"/>
*/
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String xhr = req.getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(xhr)) {
resp.setContentType("application/json;charset=UTF-8");
// 是Ajax请求,返回json数据
resp.getWriter().print("{\"success\":false,\"msg\":\"没有权限\"}");
} else {
// 不是Ajax请求和原来处理方案一样
// 拿到配置的没有权限的跳转路径
String unauthorizedUrl = this.getUnauthorizedUrl();
if (StringUtils.hasText(unauthorizedUrl)) {
// 如果有跳转路径 -> 就进行跳转
WebUtils.issueRedirect(request, response, unauthorizedUrl);
} else {
// 如果没有配置路径 -> 报401错误
WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
}
return false;
}
}
最常见的就是406 它是类型转换错误,指前台和后台交互时互传的数据类型不一致导致的,具体我们可以分为请求和响应造成的问题:
请求中:
我们可以看到,jquery使用ajax德华我们需要设置dataType: "json"才能将我们的请求MIME 类型设置为 “application/json”
$.ajax({
...
dataType: "json",
...
success: function (data) {
...
},
error: function (data) {
...
}
});
而在easyui中我们不需要设置这个dataType就已经是ajax请求了:
$.get("/role/delete",{id:row.id},function (result) {
if(result.success){
datagrid.datagrid("reload");
}else{
$.messager.alert('提示',`删除失败,原因是:${result.msg}`,"error");
}
})
响应中:
前台只需要设置:dataType: "json"就好了,它会将请求头设置成application/json,所以406这个错误又以后台响应头不为json居多
在springmvc中,我们通过引入jsonjar包来解决这个问题,而shiro我们就只能使用颇为原生的这种方式(直接设置ContentType!)来解决这个问题:
if (“XMLHttpRequest”.equals(xhr)) {
resp.setContentType(“application/json;charset=UTF-8”);
// 是Ajax请求,返回json数据
resp.getWriter().print("{“success”:false,“msg”:“没有权限”}");
}
就像我们在前面的自定义过滤器中配置的那样!
配置bean来使用我自定义的权限过滤器
成功