Filter在Spring Boot项目中调用两次

时间:2016-08-20 06:51:13

标签: java spring spring-security spring-boot

我有一个扩展AbstractAuthenticationProcessingFilter的过滤器。

在安全配置类中,我有以下内容,

  @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.addFilterBefore(getMyFilter(), BasicAuthenticationFilter.class);
        http.addFilterAfter(getMyFilter2(), MyFilter.class);
        http.csrf().disable().authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll();
    }

    private MyFilter getMyFilter() {
        return new MyFilter(properties, apiConsumer);
    }

当我使用邮递员调用REST端点时,doFilter MyFilter方法会获得两次点击。在这两个时间内,requestedSessionId中的strippedServletPathServletRequest都相同。

但扩展MyFilter2的{​​{1}}只能调用一次。

过滤器执行顺序为GenericFilterBean - > MyFilter.doFilter - > MyFilter2.doFilter

原因是什么?如何找到根本原因?

1 个答案:

答案 0 :(得分:0)

我猜这种行为只出现在第一次请求时(出现基本身份验证弹出窗口时)。如果是这样,那么这是因为基本的身份验证规范及其在Spring的BasicAuthenticationFilter

中的实现

当您第一次调用服务时,Spring会在您的请求中查找Authorization标头,如果它不存在,它会向您的浏览器发送带有WWW-Authenticate: Basic标头的响应。 当您的浏览器收到具有该特定标头的响应时,它会显示身份验证弹出窗口。当您键入用户和密码时,浏览器会发出另一个请求(现在有适当的Authorization标题),现在Spring可以正确地授权您的请求。

问题是在整个过程中Spring正在处理过滤器链两次(每次请求)。

您可以在此处详细了解基本身份验证: https://en.wikipedia.org/wiki/Basic_access_authentication