我有一个扩展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
中的strippedServletPath
和ServletRequest
都相同。
但扩展MyFilter2
的{{1}}只能调用一次。
过滤器执行顺序为GenericFilterBean
- > MyFilter.doFilter
- > MyFilter2.doFilter
原因是什么?如何找到根本原因?
答案 0 :(得分:0)
我猜这种行为只出现在第一次请求时(出现基本身份验证弹出窗口时)。如果是这样,那么这是因为基本的身份验证规范及其在Spring的BasicAuthenticationFilter
。
当您第一次调用服务时,Spring会在您的请求中查找Authorization
标头,如果它不存在,它会向您的浏览器发送带有WWW-Authenticate: Basic
标头的响应。
当您的浏览器收到具有该特定标头的响应时,它会显示身份验证弹出窗口。当您键入用户和密码时,浏览器会发出另一个请求(现在有适当的Authorization
标题),现在Spring可以正确地授权您的请求。
问题是在整个过程中Spring正在处理过滤器链两次(每次请求)。
您可以在此处详细了解基本身份验证: https://en.wikipedia.org/wiki/Basic_access_authentication