#问题:swagger接口文档请求/localhost:8080/doc.html被过滤器拦截
在使用过滤器和拦截器时候会设置拦截哪些请求,
下面这一步是设置放行哪些请求,有/login和/doc.html
但是在设置拦截/doc.html后,访问localhost:8080/doc.html去查看接口文档还是会被拦截;
解决方法:试试多放行三个路径,如下图:
//拦截所有请求
//Filter是java三大组件,要在springboot里使用要加启动类@ServletComponentScan注解
配置过滤器要拦截的请求路径( /* 表示拦截浏览器的所有请求 )
@WebFilter(urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//前置:强制转换为http协议的请求对象、响应对象 (转换原因:要使用子类中特有方法)
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//1.获取请求url
String url = request.getRequestURI().toString();
//2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
//下面这个拦截非常重要,请务必整理笔记
if (url.contains("/login") || url.equals("/doc.html") || url.contains("/swagger-ui.html") || url.contains("/swagger-resources") || url.contains("/v2/api-docs") ){
filterChain.doFilter(request, response); // 放行请求
return;
}
//3.获取请求头中的令牌(token)
String jwt = request.getHeader("token");
log.info("从请求头中获取的令牌{}",jwt);
//4.判断令牌是否存在,如果不存在,返回错误信息(未登录)
if(!StringUtils.hasLength(jwt)){
//和前端约定好的,返回Not_LOGIN
log.info("请求头token为空,返回登录信息");
Result error = Result.error("NOT_LOGIN");
//将对象转换为json字符串
String notLogain = JSONObject.toJSONString(error);
response.getWriter().write(notLogain);
return;
}
//5.解析token,如果解析失败,返回错误结果
try {
JwtUtils.parseJWT(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败,返回未登录错误信息");
Result error = Result.error("Not_Login");
//将对象转换为json字符串
String notLogain = JSONObject.toJSONString(error);
response.getWriter().write(notLogain);
return;
}
//6.放行操作
log.info("令牌合法,放行");
}