Filter学习

本文介绍了JavaEE中Filter的作用、工作流程和在SpringBoot中的三种使用方式,包括@Component + @Order、@WebFilter + @ServletComponentScan以及JavaConfig配置方式。详细阐述了Filter如何拦截HTTP请求,在Servlet处理请求前后的顺序以及如何配置过滤指定URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter 作用

Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理。

Filter 流程图

Filter执行链1. 用户发起请求被Filter链拦截
2. Filter1 放行后要经过 Filter2
3. Filter2 放行后要经过 Filter3
4. Filter3 放行后才来到了 Controller 对请求进行处理
5. Controller 处理完毕后又要经过 Filter3 放行后的后续操作
6. Filter3 放行后的后续操作处理完成后经过 Filter2 放行后的后续操作
7. Filter2 放行后的后续操作处理完成后经过 Filter1 放行后的后续操作
8. Filter1 放行后的后续操作处理完成将结果返回给用户

Filter 用法

实际工作中,我们都是使用 SpringBoot 进行业务开发,现总结三种 Filter 用法,SpringBoot 版本采用目前最新的 v2.3.1.RELEASE

  • @Component + @Order 方式 通过实现过滤器接口并交给spring管理
@Component
@Order(1)
public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("FirstFilter init .......");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FirstFilter doFilter .......");

        // 要继续处理请求,必须添加 filterChain.doFilter()
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("FirstFilter destroy .......");
    }
}

ps: order值越小越先执行

总结: 默认对所有的URL进行过滤,不能通过配置去过滤指定的URL

  • @WebFilter + @ServletComponentScan 方式 通过 @webFilter 配置过滤指定的URL, @ServletComponentScan 来指定去哪里扫描 Filter
@WebFilter(urlPatterns = "/*")
public class SecondFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("SecondFilter init .......");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("SecondFilter doFilter .......");

        // 要继续处理请求,必须添加 filterChain.doFilter()
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("SecondFilter destroy .......");
    }
}


@SpringBootApplication
@ServletComponentScan("xxx.xxx.filter")
public class ExperimentApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExperimentApplication.class, args);
    }
}

总结: 不能指定过滤器执行顺序

  • JavaConfig 配置方式
@Configuration
public class FiltersConfig {

    @Bean
    public FilterRegistrationBean registerFirstFilter(){
        FilterRegistrationBean<FirstFilter> bean = new FilterRegistrationBean<>();
        bean.setOrder(1);
        bean.setFilter(new FirstFilter());
        // 匹配"/hello/"下面的所有url
        bean.addUrlPatterns("/hello/*");
        return bean;
    }

    @Bean
    public FilterRegistrationBean registerSecondFilter(){
        FilterRegistrationBean<ThreeFilter> bean = new FilterRegistrationBean<>();
        bean.setOrder(3);
        bean.setFilter(new ThreeFilter());
        // 匹配"/hello/"下面的所有url
        bean.addUrlPatterns("/test/*");
        return bean;
    }
}

总结: 既可以指定过滤器的执行顺序还能够指定配置去过滤指定的 URL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值