第一种 @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 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<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 过滤器。

3、SpringBoot注册第三方过滤器

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

SpringBoot自定义过滤器的两种方式及过滤器执行顺序的更多相关文章

  1. 【SpringBoot】04.SpringBoot整合Filter的两种方式

    SpringBoot整合Filter过滤器的两种方式: 1.通过扫描注解完成Filter组件注册 创建一个类,实现Filter接口,实现doFilter()方法 在该类使用注解@WebFilter,设 ...

  2. iOS 自定义layer的两种方式

    在iOS中,你能看得见摸得着的东西基本都是UIView,比如一个按钮,一个标签,一个文本输入框,这些都是UIView: 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层 在创建UIVi ...

  3. EntityFramework Core 2.0自定义标量函数两种方式

    前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...

  4. SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet有两种方式: 1.通过注解扫描完成Servlet组件的注册: 2.通过方法完成Servlet组件的注册: 现在简单记录一下两种方式的实现 1.通过注解扫描完成Se ...

  5. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

  6. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

  7. 【SpringBoot】05.SpringBoot整合Listener的两种方式

    SpringBoot整合Listener的两种方式: 1.通过注解扫描完成Listener组件的注册 创建一个类实现ServletContextListener (具体实现哪个Listener根据情况 ...

  8. 【SpringBoot】03.SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet的两种方式: 1. 通过注解扫描完成Servlet组件注册 新建Servlet类继承HttpServlet 重写超类doGet方法 在该类使用注解@WebServ ...

  9. springboot整合mybatis的两种方式

    https://blog.csdn.net/qq_32719003/article/details/72123917 springboot通过java bean集成通用mapper的两种方式 前言:公 ...

随机推荐

  1. Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)

    现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...

  2. Sql Or NoSql,看完这一篇你就懂了

    前言 你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷. 这篇文章是我好几 ...

  3. HelloDjango 第 08 篇:开发博客文章详情页

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...

  4. 996工作制?不如花点时间学知识!北栀暗影教你如何用WordPress搭建专业网站

    很多70后.80后小时候都看过这样一部动画片-<半夜鸡叫>.讲的是地主"周扒皮"为了长工们能多干些活,半夜三更起来学鸡叫让长工劳动(卖身契上规定:鸡叫就得起床干活劳动) ...

  5. Appium+Python API相关知识了解

    首先,要先了解,官方Appium API // https://testerhome.com/topics/3144 刚开始的时候,没有看官方API,然后在网上瞎找学习资料,发现python相关的很少 ...

  6. git 常规业务场景 使用

    一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...

  7. MyBatis的parameterType传入参数类型

    在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的 ...

  8. 《Tomcat和JVM的性能调优你真的学会了吗?》总结篇

    Tomcat性能调优: 找到Tomcat根目录下的conf目录,修改server.xml文件的内容.对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创 ...

  9. ESXi安装报错,No network adapters were detected...

    转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/11438066.html 报错内容 No network adapters No Network a ...

  10. Python数据类型详解——列表

    Python数据类型详解--列表 在"Python之基本数据类型概览"一节中,大概介绍了列表的基本用法,本节我们详细学一下列表. 如何定义列表:在[]内以英文里输入法的逗号,,按照 ...