springboot|springboot 配置 Filter 过滤器

本贴最后更新于 1560 天前,其中的信息可能已经时移世易

javaDEMO

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: java 技术大本营
java_subscribe

springboot 配置过滤器

在阅读本文前,强烈建议大家先阅读前一篇
springboot 配置拦截器:
https://www.javastudy.cloud/articles/2019/11/08/1573185747208.html
同样强烈建议先阅读官方文档:
https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/web.html#filters
https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/howto.html#howto-add-a-servlet-filter-or-listener
https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/spring-boot-features.html#boot-features-embedded-container
配置过滤器需要以下几步:

  1. 添加相关的依赖
  2. 配置过滤器 Bean 及相应的配置
  3. 编写相关的依赖

添加相关的依赖

同样,只需要引入 web 依赖就可以了

implementation 'org.springframework.boot:spring-boot-starter-web'

配置过滤器 Bean 及相应配置

添加过滤器的 Bean 代码如下

/**
 * 这里要注意两点,一个是 @WebFilter注解, 一个是实现了Filter接口
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/8
 **/
@WebFilter("/test/*")
public class TestFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 进行逻辑处理
        System.out.println("in doFilter");
        // 一定要记得这个,逻辑处理完之后,调用过滤器链,去进入到下一个过滤器
        chain.doFilter(request,response);
    }
}

在 Main 函数类上的配置如下:

/**
 * 只需要在这里面加上一个@ServletComponentScan这个注解就可以了
 */
@SpringBootApplication
@ServletComponentScan
public class DemoApplication {

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

}

用于测试的 Controller 代码:

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/8
 **/
@RestController
public class TestController {
    @RequestMapping("test/testFilter")
    public String testFilter(){
        System.out.println("in test method");
        return "";
    }
    @RequestMapping("pass/testPass")
    public String testPass(){
        System.out.println("in pass method");
        return "";
    }
}

输出结果

image.png
image.png

引用第三方的过滤器

有种情况是 jar 包里面提供了第三方的过滤器,我们没有办法加 WebFilter 注解,这时候就要用另外一种方式添加了,如这里有个 ThirdFilter:

/**
 * 这是一个第三方的Filter,只实现了Filter,没有添加WebFilter注解
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/8
 **/
public class ThirdFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 进行逻辑处理
        System.out.println("in ThirdFilter");
        // 一定要记得这个,逻辑处理完之后,调用过滤器链,去进入到下一个过滤器
        chain.doFilter(request,response);
    }
}

需要在 Main 函数的类里面添另一个 Bean,把这个过滤器包装成一个 Bean

/**
 * 只需要在这里面加上一个@ServletComponentScan这个注解就可以了
 */
@SpringBootApplication
@ServletComponentScan
public class DemoApplication {

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

	/**
	 * 把第三方的过滤器包装成一个Spring的Bean
	 * @return
	 */
	@Bean
	public FilterRegistrationBean thirdFilter() {
		FilterRegistrationBean bean = new FilterRegistrationBean<>(new ThirdFilter());
		bean.setName("ThirdFilter");
		bean.addUrlPatterns("/test/*");
		bean.setOrder(0);
		return bean;
	}
}

结果输出

image.png

DEMO 总评

过滤器是 WEB 中的一大重要组件,和拦载器不同的是,过滤器是 Servlet 的组件,而拦截器是 spring 的组件. 过滤器会对所有的请求有效,如 js,css 这些,都会进到过滤器里面,所以我们常用过滤器进行字符转码,或者监控请求时间,登录等等. 加油吧,少年!!

DEMO 下载

demospringbootfilter.zip

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 160 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...