欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springboot实现过滤器

程序员文章站 2022-05-23 10:13:10
...

SpringBoot实现过滤器和SpringMVC上实现没有多大差别,主要的差别就是在过滤器注册上,SpringMVC是通过XML配置文件注册过滤器,而SpringBoot则是通过代码注解的形式进行注册。下面一起看下在SpringBoot上怎么实现Filter过滤器吧。

1.Filter过滤器具体实现类

@Component
@Slf4j
public class MyTestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("[ {} ] 创建啦...", this.getClass().getSimpleName());
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("[ {} ] 执行啦...", this.getClass().getSimpleName());

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        log.info("[ {} ] 被摧毁啦...", this.getClass().getSimpleName());
    }
}

2.向spring容器注册filter

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean testFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new MyTestFilter());
        registration.addUrlPatterns("/filter/*");
        registration.setName("testFilter");
        return registration;
    }
}

接下来我们试一试效果:

这是我们的测试类:

@RequestMapping("/filter")
@RestController
public class FilterController {
    @GetMapping("test001")
    public String test001() {
        return "success";
    }
}

在程序启动的时候:

Springboot实现过滤器 程序执行的时候:

Springboot实现过滤器

关闭程序的时候:

Springboot实现过滤器

过滤器各个生命周期都正常执行啦,这只是一个简单的demo,如果你需要的话,在其中加入你的业务需求就好啦。

有一点需要注意,如果有多个过滤器,怎么设置它们的执行顺序呢?只需要设置registration的order属性就行啦,SpringBoot会根据order从小到大的顺序执行:

Springboot实现过滤器

 

其实过滤器除了在Configuration文件中通过@Bean注入之外,还可以通过@WebFilter 注解来配置,

@Component
@WebFilter(urlPatterns = "/filter/*", filterName = "myTestFilter") //不知道为啥urlPatterns没起作用
@Slf4j
public class MyTestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("[ {} ] 创建啦...", this.getClass().getSimpleName());
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("[ {} ] 执行啦...", this.getClass().getSimpleName());

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        log.info("[ {} ] 被摧毁啦...", this.getClass().getSimpleName());
    }
}

我试了一下,过滤器能被执行,但是urlPattenrs参数设置无效,即使我设置了,它也会过滤所有的请求,这个问题后面有时间再仔细研究一下,要是有知道的大神可以指点一下就更好啦!

3.相关导读

springboot 拦截器不生效

Springboot 实现拦截器获取header内容

深入理解拦截器与过滤器

相关标签: Java java