前言

最近在学习filter相关的内容,有了以下的代码

@Configuration
@WebFilter
@Slf4j
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String url=servletRequest.getLocalAddr();
        System.out.println(url);
        //如果不进行下一步则会被直接过滤掉
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

诡异的一个事情发生了,就是中间的println会被触发两次,换言之就是这个filter被触发了两次。这和常规的触发器情况不太符合。

排查

找到了这个链接 https://segmentfault.com/q/1010000042024741 提到了一个现象就是重复注册问题。

解决

既然是重复注册,那就一定是开头的组件注册有问题了。观察到在这里既声明了WebFilter又用了Configuration,那我们注释其中一个试试。
结果filter的拦截就恢复正常了。