学习笔记-Springboot结合过滤器的各种顺序问题总结

过滤器的顺序分析总结
摘要由CSDN通过智能技术生成

过滤器

什么是过滤器

  1. 官方理解:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
  2. 自身理解:对所有请求进行过滤操作,获取请求携带的数据或者修改请求的某些参数。filter本质上是一种特殊的servlet,它是一种起过滤作用的特殊servlet.

Springboot 配置过滤器

  1. 自定义过滤器

    过滤器类实现 javax.servlet.Filter。然后添加注解 @WebFilter(filterName=“过滤器名称” urlPatterns=“过滤规则” )

    @Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。(大多数文章都这么说,其实是有问题的)

  2. 添加 @ServletComponentScan 注解

    在启动类上加一个注解 @ServletComponentScan(basePackages=“需要扫描的过滤器”)

简单过滤器-上代码:

1.实现Filter接口并重写方法

/**
 * @WebFilter时Servlet3.0新增的注解,原先实现过滤器,需要在web.xml中进行配置,而现在通过此注解,启动启动时会自动扫描自动注册。
 *
 * @WebFilter filterName 定义注册的过滤器的名字
 * urlPatterns 定义要拦截所有的请求
 *
 */
@Order(1)
@WebFilter(filterName="userFilter1",urlPatterns={
   "/"})
public class UserFilter1 implements Filter {
   
    public UserFilter1(){
   
        System.out.println("Bean的加载顺序-1");
    }
    
    
    Logger logger = LoggerFactory.getLogger(UserFilter1.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        logger.info("过滤器初始化1");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
        logger.info("请求处理1");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
   
        logger.info("销毁1");
    }
}

2.添加注解扫描

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

3.拦截器结果

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2022-06-08 11:01:16.678  INFO 10576 --- [           main] c.e.f.FilterServiceApplication           : Starting FilterServiceApplication using Java 1.8.0_202 on LAPTOP-7U17USMK with PID 10576 (E:\allproject\log-service-select\FilterService\target\classes started by Lenovo in E:\allproject\log-service-select)
2022-06-08 11:01:16.680  INFO 10576 --- [           main] c.e.f.FilterServiceApplication           : No active profile set, falling back to default profiles: default
2022-06-08 11:01:17.279  INFO 10576 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8888 (http)
2022-06-08 11:01:17.284  INFO 10576 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-06-08 11:01:17.285  INFO 10576 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-06-08 11:01:17.425  INFO 10576 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-06-08 11:01:17.425  INFO 10576 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 711 ms
Bean的加载顺序-1
2022-06-08 11:01:17.461  INFO 10576 --- [           main] c.e.f.controller.filter.UserFilter1      : 过滤器初始化1
2022-06-08 11:01:17.631  INFO 10576 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8888 (http) with context path ''
2022-06-08 11:01:17.631  INFO 10576 --- [           main] c.e.f.FilterServiceApplication           : Started FilterServiceApplication in 1.246 seconds (JVM running for 2.136)
2022-06-08 11:03:30.576  INFO 10576 --- [nio-8888-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-06-08 11:03:30.576  INFO 10576 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-06-08 11:03:30.577  INFO 10576 --- [nio-8888-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
2022-06-08 11:03:30.581  INFO 10576 --- [nio-8888-exec-1] c.e.f.controller.filter.UserFilter1      : 请求处理1

重点-SpringBoot多过滤器顺序问题

1 发现问题

1.先再添加两个拦截器

@Order(2)
@WebFilter(filterName="userFilter2",urlPatterns={
   "/"})
public class UserFilter2 implements Filter {
   
    public UserFilter2(){
   
        System.out.println("Bean的加载顺序-2");
    }
    Logger logger = LoggerFactory.getLogger(UserFilter2.class);

  @Override
    public void init(FilterConfig filterConfig) throws ServletException {
   
        logger.info("过滤器初始化2");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
   
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值