不會,我可以學;落后,我可以追趕;跌倒,我可以站起來;我一定行!
問題場景: 在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); } }
以上內容僅代表個人觀點,不喜勿噴...