SpringBoot⾃定义过滤器的两种⽅式及过滤器执⾏顺序
1、⾸先⾃定义过滤器
如下⾃定义过滤器 ReqResFilter 必须实现 javax.servlet.Filter。
然后添加注解 @WebFilter(javax.servlet.annotation.WebFilter),urlPatterns 过滤器要过滤的URL规则配置,filterName 过滤器的名称。
@Order(int) 注解,配合 @WebFilter 注解使⽤,⽤于多个过滤器时定义执⾏顺序,值越⼩越先执⾏。
记住上⾯这句话,稍后再说。
package com.wenbei.filter;
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 。
所以这种⽅式虽然实现起来简单,只需要注解,但⾃定义顺序就必须要限定类名,使⽤类名达到排序效果了。
如果要实现⾃定义顺序,就⽤下⾯这种。springboot和过滤器
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 = Logger(ReqResFilter1.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取 filterRegistrationBean.addInitParameter("name","hahahhhaa")设置的参数
System.out.println("init=============="+InitParameter("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 对象⾥可以获取到,
即InitParameter("name")
另外 filterRegistrationBean.setUrlPatterns(urls);可以设置多个URL匹配规则,setUrlPatterns接收⼀个List<String>类型的参数
当不设置 setOrder 次序时,过滤器的执⾏顺序默认是 Bean 的加载顺序。在当前 WebConfig 类中,先加载的是 reqResFilter1⽅法即 ReqResFilter1 过滤器,后加载的是 reqResFilter ⽅法即 ReqResFilter 过滤器。
3、SpringBoot注册第三⽅过滤器
假如我们在项⽬⾥引⼊了第三⽅的jar,要使⽤jar⾥⾯带的 Filter 的话,如果引⽤的某个jar包中的过滤器,且这个过滤器在实现时没有使⽤ @Component 标识为Spring Bean,则这个过滤器将不会⽣效。此时需要通过java代码去注册这个过滤器。也是使⽤该种⽅式进⾏注册。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论