记录下SpringBoot全局捕获异常 但对于拦截器异常无法处理的情况

  • Post author:
  • Post category:其他


此处我采用了JwtFilter 在每个请求之前

拦截器都会对请求进行拦截 导致本来很好用的@ControllerAdvice不管用了

那么怎么办呢 可以使用response即可 方法参数没有 也可以直接注入

代码示例如下


@SneakyThrows
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        //只有当请求头中包含Authorization字段时才 做下面的验证操作
        if (isLoginAttempt(request, response)) {
            JwtToken jwtToken = new JwtToken(getAuthzHeader(request));
            // 开始登陆的验证
            log.info("登陆验证~~~");
            try {
                getSubject(request, response).login(jwtToken);
            } catch (AuthenticationException e) {





            	//这里只要在错误处直接打印 返回前端 让前端根据错误码进行处理即可
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().write(JSON.toJSONString(Result.fail().message("token错误")));






                return false;
            }
        }
        return true;
    }

但是我还是推荐第二种重定向的方法 因为第一种方法可能会出现弹框

该方法是在JwtFilter里面的

 @SneakyThrows
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        //只有当请求头中包含Authorization字段时才 做下面的验证操作
        if (isLoginAttempt(request, response)) {
            JwtToken jwtToken = new JwtToken(getAuthzHeader(request));
            // 开始登陆的验证
            log.info("登陆验证~~~");
            try {
                getSubject(request, response).login(jwtToken);
            } catch (AuthenticationException e) {
                //这里只要在错误处直接打印 返回前端 让前端根据错误码进行处理即可
                responseError(response,400, "未登陆");
                return false;
            }
        }
        return true;
    }


 /**
     * 将非法请求跳转到 /filterError/**中
     */
    private void responseError(ServletResponse response, int code,String message) {
        try {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            //设置编码,否则中文字符在重定向时会变为空字符串
            message = URLEncoder.encode(message, "UTF-8");
            //如果有项目名称路径记得加上
            httpServletResponse.sendRedirect("/api/vi/filterError/" + code + "/" + message);

        } catch (IOException e1) {
            log.error(e1.getMessage());
        }
    }


@RestController
public class FilterErrorController {
    @ResponseBody
    @RequestMapping("/filterError/{code}/{message}")
    public Map<String,Object> error(@PathVariable("code")Integer code, @PathVariable("message")String message){
    	Map<String,Object> map = new HashMap<>();
        map.put("code",code);
        map.put("message",message);
        return map;
    }
}

很重要的一点 需要放行该请求 不能有拦截哦!!!

参考的就是这篇博文 有第二种跳转的方法 大家可以参考一下


https://blog.csdn.net/weixin_43344930/article/details/107902143