前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【原创】005 | 搭上SpringBoot实战专车系列五:自定义过滤器

【原创】005 | 搭上SpringBoot实战专车系列五:自定义过滤器

作者头像
java进阶架构师
发布2021-02-22 14:29:50
2680
发布2021-02-22 14:29:50
举报
文章被收录于专栏:Java进阶架构师Java进阶架构师

专车介绍

该趟专车是开往SpringBoot自定义Filter的实战专车,我们都知道Filter可以帮助完成许多统一的业务处理功能,比如:打印web请求日志、记录web请求耗时、请求鉴权等等;还可以实现资源初始化、资源释放功能。如此可以看出Filter在web开发中的地位,该篇文章将通过多种方式来实现Filter的定义,让大家充分掌握此利器。

专车问题

SpringBoot可以通过几种方式来定义Filter?

专车实战

第一步:在父模块下面新建一个名为boot-example-filter的子模块

第二步:子模块添加如下依赖

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

第三步:创建filter

第一种实现方式:使用@Component注解标注

代码语言:javascript
复制
@Component
@Order(1)
@Slf4j
public class CustomFilter1 implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("执行被@Component标注的CustomFilter1的doFilter方法");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("执行被@Component标注的CustomFilter1的init方法");
    }

    @Override
    public void destroy() {
        log.info("执行被@Component标注的CustomFilter1的destroy方法");
    }
}

第二种实现方式:使用FilterRegistrationBean进行注册

代码语言:javascript
复制
@Slf4j
public class CustomFilter2 implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("执行被CustomFilter2的doFilter方法");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("执行CustomFilter2的init方法");
    }

    @Override
    public void destroy() {
        log.info("执行CustomFilter2的destroy方法");
    }
}

@Configuration
public class WebFilterConfiguration {

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new CustomFilter2());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }
}

第三种实现方式:使用Servlet提供的注解@WebFilter来定义Filter,该种实现方式需要在启动类上添加@ServletComponentScan注解

代码语言:javascript
复制
@Slf4j
@WebFilter(filterName = "customFilter3", urlPatterns = "/*")
@Order(3)
public class CustomFilter3 implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("执行被CustomFilter3的doFilter方法");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("执行被CustomFilter3的init方法");
    }

    @Override
    public void destroy() {
        log.info("执行被CustomFilter3的destroy方法");
    }
}

第四步:创建启动类

代码语言:javascript
复制
@SpringBootApplication
@ServletComponentScan
public class FilterApplication {

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

第五步:启动应用,查看日志

代码语言:javascript
复制
执行CustomFilter2的init方法
执行被@Component标注的CustomFilter1的init方法
执行CustomFilter3的init方法

第六步:访问应用

代码语言:javascript
复制
执行被@Component标注的CustomFilter1的doFilter方法
执行CustomFilter2的doFilter方法
执行CustomFilter3的doFilter方法

第七步:关闭应用

代码语言:javascript
复制
执行CustomFilter2的destroy方法
执行被@Component标注的CustomFilter1的destroy方法
执行CustomFilter3的destroy方法

如上通过启动应用来执行Filter的初始化方法、发送web请求来指定Filter的doFilter方法、停止应用来执行Filter的销毁方法

专车总结

在SpringBoot中可以通过三种方式来定义Filter:

第一种:实现Filter接口并使用@Compnent注解标注,此种方式只能过滤/*这种路径,不能过滤特定路径

第二种:实现Filter接口并使用FilterRegistrationBean进行注册,此种方式可以更灵活定义需要过滤的路径形式(推荐使用该方式)

第三种:实现Filter接口,使用@WebFilter标注,并且需要在启动类中添加@ServletComponentScan注解,比较麻烦

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java进阶架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 专车介绍
  • 专车问题
  • 专车实战
  • 专车总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档