不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行!
问题场景: 在springboot项目中配置过滤器, 同时也集成了swagger2, 发现swagger2的地址不能访问, 没有页面弹出,参考以下:
过滤器代码如下:
public class JwtAuthenticationFilter extends OncePerRequestFilter { private static final PathMatcher pathMatcher = new AntPathMatcher(); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (StringUtils.contains(request.getServletPath(), "swagger") || StringUtils.contains(request.getServletPath(), "webjars") || StringUtils.contains(request.getServletPath(), "v2")) { if (request.getServerName().equals("localhost")) { filterChain.doFilter(request, response); } } else { if (isExceededUrl(request)) { // 登录注册请求直接放行 filterChain.doFilter(request, response); } else { // 获取请求头中的Authorization信息 String tokenHeader = request.getHeader(TokenConstants.TOKEN_HEADER); // token不存在则返回 if (StringUtils.isBlank(tokenHeader) || !tokenHeader.startsWith(TokenConstants.TOKEN_PREFIX)) { ServletOutputStream out = response.getOutputStream(); out.print(ResponseConstants.TOKEN_IS_INVALID); out.close(); return; } // token过期返回 if (JwtUtil.isExpiration(JwtUtil.getTokenByHeader(tokenHeader))) { ServletOutputStream out = response.getOutputStream(); out.print(ResponseConstants.TOKEN_IS_INVALID); out.close(); return; } String uid = ""; try { uid = JwtUtil.getUidByTokenHeader(request.getHeader(TokenConstants.TOKEN_HEADER)); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("uid", uid); HttpServletRequest req = (HttpServletRequest) request; MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(req); mutableRequest.putHeader("uid", uid); filterChain.doFilter(request, response); } } } /** * @Description:我们只对地址 /api 开头的api检查jwt. 不然的话登录/login也需要jwt 做url匹配,参考 * https://www.cnblogs.com/zhangxiaoguang/p/5855113.html * @param request * @return boolean */ private boolean isProtectedUrl(HttpServletRequest request) { return pathMatcher.match("/**", request.getServletPath()); } /** * @Description:登录注册不做校验 * @param request * @return boolean */ private boolean isExceededUrl(HttpServletRequest request) { return pathMatcher.match("/user/login", request.getServletPath()) || pathMatcher.match("/user/register", request.getServletPath()); } }
解决不能访问的问题, 需要添加swagger2的静态资源映射:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); WebMvcConfigurer.super.addResourceHandlers(registry); } }
以上内容仅代表个人观点,不喜勿喷...