【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 版权协议,转载请附上原文出处链接和本声明。