SpringBoot自定义过滤器的两种方式及过滤器执行顺序

SpringBoot自定义过滤器的两种方式及过滤器执行顺序

转载
https://www.cnblogs.com/ibigboy/p/11528775.html

第一种 @WebFilter + @ServletComponentScan 注解
1、首先自定义过滤器
如下自定义过滤器 ReqResFilter 必须实现 javax.servlet.Filter。

然后添加注解 @WebFilter(javax.servlet.annotation.WebFilter),urlPatterns 过滤器要过滤的URL规则配置,filterName 过滤器的名称。

@Order(int) 注解,配合 @WebFilter 注解使用,用于多个过滤器时定义执行顺序,值越小越先执行。

记住上面这句话,稍后再说。

复制代码
package com.wenbei.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//@Order(1)
@Slf4j
@WebFilter(urlPatterns = “/*”, filterName = “reqResFilter”)
public class ReqResFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
        throws IOException, ServletException {
    log.info("=============自定义过滤器============");
    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 reqResFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
ReqResFilter reqResFilter = new ReqResFilter();
filterRegistrationBean.setFilter(reqResFilter);
     filterRegistrationBean.addUrlPatterns("*.json");//配置过滤规则
     return filterRegistrationBean;
  }
}
复制代码

2、确保 WebConfig 类能被扫描到就可以了,然后启动springboot 访问你的接口就会看到打印过滤器里的内容了。

2、多个过滤器时如何配置
多个过滤器,怎么配置,都写在一个 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 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类型的参数

当不设置 setOrder 次序时,过滤器的执行顺序默认是 Bean 的加载顺序。在当前 WebConfig 类中,先加载的是 reqResFilter1方法 即 ReqResFilter1 过滤器,后加载的是 reqResFilter 方法 即 ReqResFilter 过滤器。

3、SpringBoot注册第三方过滤器
假如我们在项目里引入了第三方的jar,要使用jar里面带的 Filter 的话,如果引用的某个jar包中的过滤器,且这个过滤器在实现时没有使用 @Component 标识为Spring Bean,则这个过滤器将不会生效。此时需要通过java代码去注册这个过滤器。也是使用该种方式进行注册。

说的再好,不如行动。不怕慢,就怕站。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值