简体   繁体   English

springboot过滤器执行两次

[英]springboot filter execute twice

I use SpringBoot2.1.5 to generate a web application, and I use maven package a war to deploy in outside tomcat9. 我使用SpringBoot2.1.5生成一个Web应用程序,并且使用maven包将war部署在tomcat9外部。 I created a filter to print request uri,but the filter execute twice time. 我创建了一个过滤器来打印请求uri,但是过滤器执行两次。 but when I use the ide console or package of jar, it just print only once!? 但是当我使用IDE控制台或jar包时,它只打印一次!

Console and log file output two identical url, not /favicon.ico ,just test url, and the timestamps of the two outputs are different 控制台和日志文件输出两个相同的URL,不是/favicon.ico ,仅测试URL,两个输出的时间戳不同

filter.java 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());
    }
}

output 输出

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

I expect the print only once about that,but it print twice thx. 我希望只打印一次,但是要打印两次。

Use org.springframework.web.filter.OncePerRequestFilter instead of Filter . 使用org.springframework.web.filter.OncePerRequestFilter而不是Filter As the name suggest this will make sure that the filter will be executed only once per request. 顾名思义,这将确保每个请求仅执行一次过滤器。

Since OncePerRequestFilter is a class you need to extend it instead of implements. 由于OncePerRequestFilter是一个类,因此您需要扩展它而不是实现。

From the Javadoc: 从Javadoc:

Filter base class that aims to guarantee a single execution per request dispatch, on any servlet container. 过滤器基类,旨在确保在任何servlet容器上每个请求分派单个执行。 It provides a doFilterInternal(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) method with HttpServletRequest and HttpServletResponse arguments. 它提供了带有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