为什么spring boot过滤两次?

时间:2017-06-27 08:28:42

标签: java spring-boot

我的春季启动版本是1.5.4,这是我的配置代码

@WebFilter(urlPatterns = "/*")
public class LogFilter implements Filter {


@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("LogFilter");
    chain.doFilter(request, response);
}

//init and destroy

这是我的servlet过滤器代码

LogFilter
test
LogFilter <----the second time

当我访问http://localhost:8080/控制台已打印

OutputStream imageStream = new FileOutputStream("yourImage.png");
yourImageBitmap.compress(CompressFormat.PNG, 100, imageStream);
imageStream.close();

为什么要调用过滤器两次?Spring boot为什么这样做?是否有相关文件或来源参考?我希望他打电话一次,我该怎么办?

更新:thx所有问题都已解决

4 个答案:

答案 0 :(得分:2)

我可以想到这种行为的两个常见原因:

  1. Spring应用程序上下文由您的应用程序加载两次
  2. 重定向导致端点上的第二个请求

答案 1 :(得分:2)

问题的答案在文档中:

  

每次在请求/响应对通过链时,容器都会调用Filter的doFilter方法,因为客户端请求链末端的资源。

Source

答案 2 :(得分:2)

如果您尝试从doFilter方法记录请求url,您将明白原因。这是我创建新的SpringBoot项目并使用doFilter方法进行测试。

    @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    logger.info(request.getRequestURL().toString());
    filterChain.doFilter(servletRequest,servletResponse);
}

好吧,这两个网址是

http://localhost:8080/index
http://localhost:8080/favicon.ico

答案 3 :(得分:1)

请检查您在其中定义过滤器的类是bean还是常规类。如果是Bean /组件,则无需在安全配置中专门注册过滤器,例如使用

http.addFilterBefore(new YourFilter(), BasicAuthenticationFilter.class). 

通过如上所述另外注册一个bean,同一过滤器将执行两次。