为何配置在UsernamePasswordAuthenticationFilter后执行的MyCustomFilter仍被调用
问题原因拆解
1. 为什么UsernamePasswordAuthenticationFilter未触发,但MyCustomFilter仍然执行
addFilterAfter的作用是将自定义过滤器插入到Spring Security过滤器链的指定顺序位置,并不是绑定规则为「仅当前置过滤器执行后才触发当前过滤器」:UsernamePasswordAuthenticationFilter默认仅匹配POST /login的登录请求,你发起普通GET请求、访问其他路径时,该过滤器本身就会跳过执行,但Spring Security的过滤器链还是会按顺序向后执行,你插在它后续位置的MyCustomFilter自然会被正常调用。
2. 为什么过滤器日志打印两次
有两个最常见的诱因:
- 浏览器默认请求:直接通过浏览器访问地址时,浏览器会自动发起两次请求,一次是你访问的目标路径,另一次是
/favicon.ico站点图标请求,两个请求都会经过过滤器,导致两次打印。你可以用Postman、curl等接口调试工具直接发请求验证,如果仅打印一次就是该原因导致。 - 过滤器重复注册:如果你的
MyCustomFilter类上添加了@Component、@Service这类Spring组件注解,Spring Boot会自动将它注册到全局Servlet过滤器链,同时你又在Spring Security的配置中手动添加了一次该过滤器,等于同一个过滤器会被两个不同的过滤器链各调用一次,就会出现两次打印的情况。
修复方案
- 若为favicon请求导致:可以在Security配置中添加规则忽略
/favicon.ico路径,或者使用接口调试工具发起请求即可规避该干扰。 - 若为重复注册导致:要么去掉
MyCustomFilter上的Spring组件注解,仅在Security配置中手动实例化添加;要么新增如下配置,禁止Spring Boot自动将该过滤器注册到全局过滤器链:
@Bean public FilterRegistrationBean<MyCustomFilter> disableAutoRegistration(MyCustomFilter filter) { FilterRegistrationBean<MyCustomFilter> registration = new FilterRegistrationBean<>(filter); registration.setEnabled(false); return registration; }
内容的提问来源于stack exchange,提问作者Chris A
相关产品推荐
相关产品推荐

