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";
}
}
在程序启动的时候:
程序执行的时候:
关闭程序的时候:
过滤器各个生命周期都正常执行啦,这只是一个简单的demo,如果你需要的话,在其中加入你的业务需求就好啦。
有一点需要注意,如果有多个过滤器,怎么设置它们的执行顺序呢?只需要设置registration的order属性就行啦,SpringBoot会根据order从小到大的顺序执行:
其实过滤器除了在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.相关导读
上一篇: 第六章节 优先队列/堆
下一篇: 登录、注册小练习