簡體   English   中英

springboot過濾器執行兩次

[英]springboot filter execute twice

我使用SpringBoot2.1.5生成一個Web應用程序,並且使用maven包將war部署在tomcat9外部。 我創建了一個過濾器來打印請求uri,但是過濾器執行兩次。 但是當我使用IDE控制台或jar包時,它只打印一次!

控制台和日志文件輸出兩個相同的URL,不是/favicon.ico ,僅測試URL,兩個輸出的時間戳不同

filter.java

@Slf4j
@Component
@WebFilter(filterName = "ApiFilter", urlPatterns = "/*")
public class RequestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        long time = System.currentTimeMillis();
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        filterChain.doFilter(servletRequest, servletResponse);
        StringBuilder params = new StringBuilder("?");
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            params.append(entry.getKey()).append("=");
            for (String s : entry.getValue()) {
                params.append(s).append(",");
            }
            params.deleteCharAt(params.length() - 1);
            params.append("&");
        }
        params.deleteCharAt(params.length() - 1);
        System.out.println("HAHAHAHAHAHAHa");
        log.info("[{}] {}ms, {}{}", request.getMethod(),System.currentTimeMillis() - time, request.getRequestURI(), params.toString());
    }
}

輸出

19-09-11 19:33:39.450 [http-nio-8989-exec-1] INFO  com.proj.aftermarket.config.RequestFilter - [POST] 14ms, /Proj/web-control!checkTime.do
19-09-11 19:33:39.451 [http-nio-8989-exec-1] INFO  com.proj.aftermarket.config.RequestFilter - [POST] 15ms, /Proj/web-control!checkTime.do

我希望只打印一次,但是要打印兩次。

使用org.springframework.web.filter.OncePerRequestFilter而不是Filter 顧名思義,這將確保每個請求僅執行一次過濾器。

由於OncePerRequestFilter是一個類,因此您需要擴展它而不是實現。

從Javadoc:

過濾器基類,旨在確保在任何servlet容器上每個請求分派單個執行。 它提供了帶有HttpServletRequestHttpServletResponse參數的doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM