关于 Filter 接口的使用

传统 servlet 方式

主类添加 @ServletComponentScan 注解

@SpringBootApplication
@ServletComponentScan(basePackages = "com.xxx.filter")
public class CoreApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(CoreApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  ==CoreApplication== 启动成功   ლ(´ڡ`ლ)゙  ");
    }

}

实现 Filter 接口并添加 @WebFilter 注解

@Slf4j
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter doFilter. uri: {}", ((HttpServletRequest) servletRequest).getRequestURI());
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

这种情况下,Spring Boot会通过 WebFilterHandler 来注册这个过滤器。

@Component 方式

仅添加 @Component 注解(不再需要 @ServletComponentScan 注解和 @WebFilter 注解)

@Slf4j
@Component
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("MyFilter doFilter. uri: {}", ((HttpServletRequest) servletRequest).getRequestURI());
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

这中情况下,Spring 会将这个过滤器类视为一个普通的 Bean。Spring Boot 会检测到这个 Bean 实现了 Filter 接口,并通过 FilterRegistrationBean 来注册这个过滤器到Servlet容器中。这种方式不依赖于 @WebFilter 注解,而是通过 Spring 的组件扫描机制来发现和注册过滤器。在这种情况下,过滤器的调用会直接由 Tomcat 的 ApplicationFilterChain 处理,因为它已经被注册到了 Servlet 容器的过滤器链中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容