先說下springboot的攔截器!
我的需求是測試提出了,在生產環境下,swagger-ui.html 不應該可以訪問,再網上看了很多yml的配置,由於我集成的swagger是引入提取的公共jar包,不方便大規模改動
於是就考慮用攔截器攔截瀏覽器的swagger-ui.html 這個請求
如下,是寫了個配置文件,攔截請求,返回404,但是有個問題,就是 /v2/api-docs這個文件是攔截不了的,貌似是因為他是靜態文件,但是我也不知道是什么原因,反正就是很郁悶,攔截不了
package com.ehl.citycockpit.web.swagger; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Profile("!swagger") @RestController @Slf4j @Configuration public class SwaggerConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { /** *此處攔截路徑(/**) * 注意兩個**。一個*號只攔截一級路徑下,兩個*號攔截所有 */ registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { log.info("request請求地址path[{}] uri[{}]", request.getServletPath(), request.getRequestURI()); //這里的異常是我自定義的異常,系統拋出異常后框架捕獲異常然后轉為統一的格式返回給前端, 其實這里也可以返回false response.setStatus(HttpStatus.NOT_FOUND.value()); return false; } //下面的這個兩個方法如果用不到可以不實現 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }).addPathPatterns("/swagger-ui.html"); } }
然后繼續說另外一種過濾器的方法
首先,實現implement filter 然后重寫 doFilter 代碼如下
package com.ehl.citycockpit.config; import com.esotericsoftware.minlog.Log; import net.hasor.utils.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class ApiCorsFilter implements Filter { //過濾swagger的相關請求,如果需要用到swagger刪除如下代碼即可,想攔截其他內容可以在下方配置! private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>( Arrays.asList("/swagger-ui.html", "/v2/api-docs"))); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response;
} HttpServletRequest request1 = (HttpServletRequest) request; //獲取請求路徑 String path = request1.getRequestURI().substring(request1.getContextPath().length()).replaceAll("[/]+$", ""); boolean filterPath = ALLOWED_PATHS.contains(path); //判斷路徑是否包含你想過濾的內容 if (filterPath) { Log.info("這里是需要處理的url進入的方法"); } else { Log.info("這里是不需要處理的url進入的方法"); chain.doFilter(request, response); } } }
如果不想用這種方式可以參考其他yml配置的方式,根據不同問題找合適的結局方法,還請大佬指點為什么攔截器不能攔截 /v2/api-docs