第一种 @webFilter + @ServletComponentScan 注解
1, 首先自定义过滤器
如下自定义过滤器 ReqResFilter 必须实现 javax.servlet.Filter. 然后添加注解 @WebFilter(javax.servlet.annotation.WebFilter),urlPatterns 过滤器要过滤的 URL 规则配置, filterName 过滤器的名称.
@Order(int) 注解, 配合 @WebFilter 注解使用, 用于多个过滤器时定义执行顺序, 值越小越先执行.
记住上面这句话, 稍后再说.
- //@Order(1)
- @WebFilter(urlPatterns = "*.json", filterName = "reqResFilter")
- public class ReqResFilter implements Filter {
- private static Logger logger = LoggerFactory.getLogger(ReqResFilter.class);
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
- throws IOException, ServletException {
- System.out.println("11111111111111111111111111111");
- filterChain.doFilter(servletRequest,servletResponse);
- }
- @Override
- public void destroy() {
- }
- }
2, 添加 @ServletComponentScan 注解
然后在启动类上加一个注解 @ServletComponentScan 就可以了, 然后启动 springboot 访问你的接口就会看到打印过滤器里的内容了.
3, 多个过滤器如何指定执行顺序?
刚才说了, 使用 @Order 注解指定一个 int 值, 越小越先执行. 很多博客文章都是这么说的, 但你真正的试了吗? 真的可以使用这个注解指定顺序吗? 答案是否定的.
经过测试, 发现 @Order 注解指定 int 值没有起作用, 是无效的. 为啥? 因为看源码发现 @WebFilter 修饰的过滤器在加载时, 没有使用 @Order 注解, 而是使用的类名来实现自定义 Filter 顺序, 详细的可以参考这篇或者是这篇
所以这种方式下想定义 Filter 的顺序, 就必须限定 Filter 的类名, 比如刚才那个 Filter 叫 ReqResFilter , 加入我们现在新写了一个 Filter 叫 AlibabaFilter , 那么顺序就是 AlibabaFilter> ReqResFilter .
所以这种方式虽然实现起来简单, 只需要注解, 但自定义顺序就必须要限定类名, 使用类名达到排序效果了.
如果要实现自定义顺序, 就用下面这种.
第二种 自定义配置类配置过滤器
1, 单个过滤器时
1, 自定义配置类加载自定义过滤器 ReqResFilter
还是刚才那个自定义过滤器, 只不过上面的两个注解都可以去掉了.
- @Configuration
- public class WebConfig {
- @Bean
- public FilterRegistrationBean timeFilter() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- ReqResFilter reqResFilter = new ReqResFilter();
- filterRegistrationBean.setFilter(reqResFilter);
- filterRegistrationBean.addUrlPatterns("*.json");// 配置过滤规则
- return filterRegistrationBean;
- }
- }
2, 确保 WebConfig 类能被扫描到就可以了, 然后启动 springboot 访问你的接口就会看到打印过滤器里的内容了.
3, 多个过滤器时如何配置
多个过滤器, 怎么配置, 都写在一个 FilterRegistrationBean 里吗? 配置执行顺序怎么配置? 过滤器名称怎么配置
新增一个过滤器
如下, 新增一个过滤器 ReqResFilter1
- public class ReqResFilter1 implements Filter {
- private static Logger logger = LoggerFactory.getLogger(ReqResFilter1.class);
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- // 获取 filterRegistrationBean.addInitParameter("name","hahahhhaa") 设置的参数
- System.out.println("init=============="+filterConfig.getInitParameter("name"));
- }
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("2222222222222222222222222222");
- filterChain.doFilter(servletRequest,servletResponse);
- }
- @Override
- public void destroy() {
- }
- }
修改配置类
现在我们有两个过滤器 ReqResFilter 和 ReqResFilter1 , 怎么设置执行顺序. 请看下面的代码.
这里我们, 咋 WebConfig 类里再写一个 reqResFilter1 方法注册新增的这个过滤器. 和刚才不同的是我们指定了 多个过滤器的 Order 即执行顺序, ReqResFilter1 的 Order 为 2, 设置 ReqResFilter 的 Order 为 1.
- @Configuration
- public class WebConfig {
- @Bean
- public FilterRegistrationBean reqResFilter1() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- ReqResFilter1 reqResFilter1 = new ReqResFilter1();
- filterRegistrationBean.setFilter(reqResFilter1);
- filterRegistrationBean.addUrlPatterns("*.json");// 配置过滤规则
- filterRegistrationBean.addInitParameter("name","hahahhhaa");// 设置 init 参数
- filterRegistrationBean.setName("reqResFilter1");// 设置过滤器名称
- filterRegistrationBean.setOrder(2);// 执行次序
- return filterRegistrationBean;
- }
- @Bean
- public FilterRegistrationBean reqResFilter() {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
- ReqResFilter reqResFilter = new ReqResFilter();
- filterRegistrationBean.setFilter(reqResFilter);
- // 配置多个过滤规则
- // List<String> urls = new ArrayList<>();
- // urls.add("/order/*");
- // urls.add("/user/*");
- // filterRegistrationBean.setUrlPatterns(urls);
- filterRegistrationBean.addUrlPatterns("*.json");// 配置过滤规则
- filterRegistrationBean.setName("reqResFilter");// 设置过滤器名称
- filterRegistrationBean.setOrder(1);// 执行次序
- return filterRegistrationBean;
- }
- }
另外 filterRegistrationBean.addInitParameter("name","hahahhhaa");// 设置 init 参数 设置的参数在 Filter 的 init 方法里的 FilterConfig 对象里可以获取到, 即 filterConfig.getInitParameter("name")
另外 filterRegistrationBean.setUrlPatterns(urls); 可以设置多个 URL 匹配规则, setUrlPatterns 接收一个 List<String > 类型的参数
当不设置 setOrder 次序时, 过滤器的执行顺序默认是 Bean 的加载顺序. 在当前 WebConfig 类中, 先加载的是 reqResFilter1 方法 即 ReqResFilter1 过滤器, 后加载的是 reqResFilter 方法 即 ReqResFilter 过滤器.
来源: https://www.cnblogs.com/ibigboy/p/11528775.html