You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何配置在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:12:02