Spring Boot Filter 过滤器的使用方式

 更新时间:2022年09月20日 09:28:22   作者:LP学长​​​​​​​  
这篇文章主要介绍了Spring Boot Filter 过滤器的使用方式,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言:

要想使用 filter,需要写一个方法继承 Filter 类,我们写如下两个自己的 Filter 类,首先是 FirstFilter 类,其中 @Order 里边的数字越小代表越先被该 Filter 过滤,@WebFilter 代表这是个 Filter 类并把这个类注入到容器中:

/**** imports ****/

@Order(1)
@WebFilter(filterName="firstFilter", urlPatterns="/*")
public class FirstFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    System.out.println("first filter 1");
    chain.doFilter(request, response);
    System.out.println("first filter 2");
  }

  @Override
  public void destroy() {
  }
}

然后是第二个 Filter,SecondFilter 类:

/**** imports ****/

@Order(2)
@WebFilter(filterName="secondFilter", urlPatterns="/*")
public class SecondFilter implements Filter {
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    System.out.println("second filter 1");
    System.out.println("before:" + response);
    chain.doFilter(request, response);
    System.out.println("after:" + response);
    System.out.println("second filter 2");
  }

  @Override
  public void destroy() {
  }
}

然后我们把 Controller 类也写出来:

/**** imports ****/

@RestController
public class TestController {
  @GetMapping("/test1")
  public String test1() {
    System.out.println("method in controller");
    return "test1";
  }
}

最后是 Spring Boot 的主方法入口,注意,由于我们使用注解注入的 Filter,所以要在下边这个 Application 类中加入@ServletComponentScan 注解:

/**** imports ****/

@SpringBootApplication
@ServletComponentScan
public class ExecutorTestApplication {
  public static void main(String[] args) {	
    ConfigurableApplicationContext applicationContext = SpringApplication.run(ExecutorTestApplication.class, args);
  }
}

首先我们先来看一下执行结果,启动后访问 127.0.0.1:8080/test1,在后台中打印如下信息:

我们可以看出代码执行的流程:

  • 请求被 firstFilter 截获,打印出 first filter 1
  • 执行 chain.doFilter(request, response),这句话代表着请求会转发给过滤器链上下一个对象,也就是 secondFilter,所以打印出 secondFilter 里的 second filter 1
  • 执行 secondfilter 里的 chain.dofilter() 方法,请求再转发给下一个对象,由于没有其他的 filter 了,所以会转发给 controller,打印出了 controller 类中的 method in controller
  • 内存栈里调用 secondFilter 的 print("second filter 2")
  • 内存栈里调用 firstfilter 的 print("first filter 1")

所以如果在自己实现的 Filter 类的 doFilter 方法里不加 chain.doFilter(req, rep) 是不行的,那样会导致请求到了这个 filter 里就不再往下走了,永远进不了 controller 中。

我们也可以在 print("before:" + response) 和 print("after:" + response) 这两个地方打上断点,然后调试一下,会发现在 before 那里的 response 里是什么都么有的,而在 after 那里的 response 里则是已经有了 test1 字符串,也就是说 controller 类 test1 方法的返回值已经添加进了 response,所以如果想要对请求的 response 做一下过滤处理,那么要在 chain.doFilter(res, rep) 之后写你的逻辑。

到此这篇关于Spring Boot Filter 过滤器的使用方式的文章就介绍到这了,更多相关Spring Boot Filter 过滤器 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中正则表达式的使用和详解(下)

    Java中正则表达式的使用和详解(下)

    这篇文章主要介绍了Java正则表达式的使用和详解(下)的相关资料,包括常用正则表达式和正则表达式语法,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-04-04
  • Java中Agent的使用详解

    Java中Agent的使用详解

    Java Agent是一种特殊类型的软件组件,它允许在Java虚拟机(JVM)运行时修改应用程序的字节码,下面我们就来一起深入了解一下Agent的具体使用吧
    2023-12-12
  • 详解SpringBoot 使用Spring Initializr 快速构建工程(官方推荐)

    详解SpringBoot 使用Spring Initializr 快速构建工程(官方推荐)

    本篇文章主要介绍了SpringBoot 使用Spring Initializr 快速构建工程(官方推荐),非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    Spring扩展BeanFactoryPostProcessor使用技巧详解

    这篇文章主要为大家介绍了Spring扩展BeanFactoryPostProcessor使用技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Eclipse添加xml文件提示及Hibernate配置学习

    Eclipse添加xml文件提示及Hibernate配置学习

    文件提示功能在开发过程中很实用的,本文实现了一个Eclipse添加xml文件提示,感兴趣的朋友可以了解下啊,希望本文对你有所帮助
    2013-01-01
  • 浅谈Java中ThreadLocal内存泄露的原因及处理方式

    浅谈Java中ThreadLocal内存泄露的原因及处理方式

    内存泄漏就是我们申请了内存,但是该内存一直无法释放,就会导致内存溢出问题,本文详细的介绍了ThreadLocal内存泄露的原因及处理方式,感兴趣的可以了解一下
    2023-05-05
  • Java中this,static,final,const用法详解

    Java中this,static,final,const用法详解

    这篇文章主要介绍了Java中this,static,final,const用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • SpringBoot整合Security权限控制登录首页

    SpringBoot整合Security权限控制登录首页

    这篇文章主要为大家介绍了SpringBoot整合Security权限控制登录首页示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java开发之Lombok指南

    Java开发之Lombok指南

    Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。下面我们来详细了解一下吧
    2019-06-06
  • MyBatis实现动态SQL的实现方法

    MyBatis实现动态SQL的实现方法

    这篇文章主要介绍了MyBatis实现动态SQL的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论