shiro捕捉不到Authoricaton异常进行处理的解决办法

AuthenticationException 异常时Shiro内部进行抛出的,全局异常捕获器在 Filter 之后执行,不能正常进行补捕获,只能在 Filter内部进行处理。

解决方案:

自定义的realm抛出错误信息:
            /*验证这个账号是否被封号了*/
            if(userRespository.getBan()==1){
                throw new AuthenticationException("账号已被封禁,请联系管理员");
            }

自定义filter:

        private String errorMsg;//用于接收realm抛出的异常信息“账号已被封禁,请联系管理员”
        private Logger logger = LoggerFactory.getLogger(this.getClass());

        /**
         * 如果带有 token,则对 token 进行检查,否则直接通过
         */
        @Override
        protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws UnauthorizedException {
            //判断请求的请求头是否带上 "Token"用到了isLoginAttempt
            if (isLoginAttempt(request, response)) {
                //如果存在,则进入 executeLogin 方法执行登入,检查 token 是否正确
                try {
                    executeLogin(request, response);
                } catch (Exception e) {
                    //token 错误
                    errorMsg=e.getMessage();
                    return false ;/*别漏了这个只有返回false才会进入 onAccessDenied 方法进而返回json格式错误信息给前端*/
                }
            }
            //如果请求头不存在 Token,则可能是执行登陆操作或者是游客状态访问,无需检查 token,直接返回 true
            System.out.println("请求头token为空返回true");
            return true;
        }

如果上述方法抛出异常并且return false后会进入下面这个方法:

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setStatus(200);
        httpServletResponse.setContentType("application/json;charset=utf-8");
        JSONObject json = new JSONObject();
        if("账号已被封禁,请联系管理员".equals(errorMsg)){
            json.put("status",202);
            json.put("msg","账号已被封禁,请联系管理员");
        }else{ json.put("status",402);
            json.put("msg","凭证失效或已过期,请重新登陆!");}
        PrintWriter out = httpServletResponse.getWriter();
        out.println(json);
        out.flush();
        out.close();
        return false;//返回false拒绝访问会直接返回错误信息
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值