【Bug记录】SpringBoot使用拦截器,打开swagger-ui.html页面,idea控制台报错

一、问题描述

最近在做项目的时候,使用了拦截器进行对请求的拦截。用户在登录之后,后端会将当前的sessionId以cookie的形式存放在本地的浏览器,设置30天的过期时间,同时也在redis定时存放其sessionId,以起到一个简单的拦截作用!在设置拦截器的拦截路径的时候,因为有很多隐藏的请求你是不清楚的,所以会导致你项目的一些请求会被拦截到,以至于idea的控制台会报错。

二、代码描述

@Component
public class AuthInterceptor implements HandlerInterceptor {

    private RedisUtil redisUtil;

    @Autowired
    public void setRedisUtil(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     * @param request
     * @param response
     * @param handler
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {


        //获取session中的cookies
        Cookie[] cookies = request.getCookies();

        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("JSESSIONID".equals(cookie.getName())) {

                    System.out.println(request.getRequestURI());
                    HttpSession session = request.getSession();
                    User user = (User) session.getAttribute("user");
                    if (user != null) {
                        String key = "user_" + user.getUsername() + "_sessionId";
                        //与redis中对应的sessionId比较
                        String value = (String) redisUtil.get(key);
                        //如果设置为true时,请求将会继续执行后面的操作
                        if (cookie.getValue().equals(value)) {
                            return true;
                        }
                    }

                }
            }

        }

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        PrintWriter out = null;
        JSONObject res = new JSONObject();
        ResultInfo resultInfo = new ResultInfo(0, "", "请先登录!");
        res.put("responseData", resultInfo);
        out = response.getWriter();
        out.append(res.toString());


        return false;

    }

    /**
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    }

    /**
     * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
     * @param request
     * @param response
     * @param handler
     * @param ex
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    }


}

你只需要在preHandle方法中打印其请求路径,就可以知道哪个路径访问而被拦截了!然后再进行忽略路径的设置!
在这里插入图片描述

三、相关swagger路径

以下是不需要进行拦截的swagger路径:

.excludePathPatterns("/swagger-ui.html")
.excludePathPatterns("/configuration/ui")
.excludePathPatterns("/swagger-resources")
.excludePathPatterns("/configuration/security")
.excludePathPatterns("/v2/api-docs")
.excludePathPatterns("/error")
.excludePathPatterns("/webjars/**");

版权声明:本文为qq_43647384原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>