aisell(7) shiro处理ajax请求问题(自定义权限过滤器)

引入

在这里插入图片描述

原因

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来使用我自定义的权限过滤器
在这里插入图片描述

成功

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值