当使用多个Filter时,这些Filter将形成一个Filter链,web服务器在实例化Filter对象时,会将此Filter链传递给doFilter的FilterChain参数。当一个Filter执行doFilter方法时,在此方法中执行FilterChain参数的doFilter方法,将会执行下一个Filter(Filter链下一个还是Filter时)或者访问WEB资源(Filter链中没有Filter了),如图所示:

下面是在web.xml中配置多个Filter,通过程序来演示各个Filter的其执行先后顺序。

<filter>   <filter-name>FilterUtils</filter-name><filter-class>cn.itcast.utils.FilterUtils</filter-class></filter><filter-mapping><filter-name>FilterUtils</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping><filter> <filter-name>EncodeFilter</filter-name><filter-class>cn.itcast.utils.EncodeFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>EncodeFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping><filter>    <filter-name>FilterJsp</filter-name><filter-class>cn.itcast.utils.FilterJsp</filter-class></filter><filter-mapping><filter-name>FilterJsp</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping>

三个Filter

public class FilterUtils implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stubSystem.out.println("FilterUtils destory....");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {System.out.println("FilterUtils start....");chain.doFilter(req, resp);System.out.println("FilterUtils end....");}@Overridepublic void init(FilterConfig config) throws ServletException {System.out.println("FilterUtils init....");}}public class EncodeFilter implements Filter {private String encode;@Overridepublic void destroy() {// TODO Auto-generated method stubSystem.out.println("EncodeFilter destroy....");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub
//      req.setCharacterEncoding(encode);
//      resp.setCharacterEncoding(encode);
//      resp.setContentType("text/html;charset="+encode+"");
//      chain.doFilter(req, resp);System.out.println("EncodeFilter start....");chain.doFilter(req, resp);System.out.println("EncodeFilter end....");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub//    encode = filterConfig.getInitParameter("encoding");System.out.println("EncodeFilter init....");}}public class FilterJsp implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stubSystem.out.println("FilterJSP destory....");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub
//      System.out.println("do Filter....");
//      req.setCharacterEncoding("UTF-8");
//      resp.setCharacterEncoding("UTF-8");
//      resp.setContentType("text/html;charset=UTF-8");
//      chain.doFilter(req, resp);System.out.println("FilterJsp start....");chain.doFilter(req, resp);System.out.println("FilterJsp end....");}@Overridepublic void init(FilterConfig config) throws ServletException {// TODO Auto-generated method stub
//      System.out.println("init....");
//      System.out.println("Filter Name is:"+config.getFilterName());
//      Enumeration enumation = config.getInitParameterNames();
//      String name;
//      while(enumation.hasMoreElements()){
//          name = (String) enumation.nextElement();
//          System.out.println("name is:"+name);
//          System.out.println("value is:"+config.getInitParameter(name));
//      }System.out.println("FilterJsp init....");}}

//初始化结果:

FilterUtils init…
EncodeFilter init…
FilterJsp init…

//访问WEB资源时的结果

FilterUtils start…
EncodeFilter start…
FilterJsp start…
你好中国
FilterJsp end…
EncodeFilter end…
FilterUtils end…

//web服务器关闭时结果:

FilterUtils destory…
EncodeFilter destroy…
FilterJSP destory…

Filter的FilterChain执行顺序相关推荐

  1. Filter过滤器链执行顺序

    Web应用允许多个过滤器来过滤页面请求--联想现实生活中的例子是最好理解的啦!比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤. 这个时候就分为两种情况了 1:多个过滤器过滤的URL不同,那么 ...

  2. JavaWeb——多个Filter代码的执行顺序

    转载于:https://www.cnblogs.com/yangHS/p/11195358.html

  3. WEB API 系列(二) Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don't Repeat Yourself)思想 ...

  4. WEB API Filter的使用以及执行顺序

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don't Repeat Yourself)思想 ...

  5. nginx开发_Filter模块执行顺序

    Filter模块执行顺序 Filter模块的执行顺序是在执行configure文件时决定的,configure文件执行完成后生成objs/ngx_modules.c,文件中定义了一个数组ngx_mod ...

  6. java 过滤器执行图_「filterchain」java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序 - seo实验室...

    filterchain 过滤器拦截到请求之后,首先是执行doFilter()方法中chain.doFilter()之前的代码,然后放弃权限给下一个过滤器或者serverlet等等,最后才执行chain ...

  7. 验证多个Filter过滤一个资源时执行顺序

    当有多个Filter过滤一个资源时,执行顺序到底是怎样? 如下测试: 定义两个Filter,FirstFilter,SecondFilter,它们过滤同一个index.jsp页面,并且SecondFi ...

  8. 排队器拦截_过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别

    首先建立一个SpringBoot工程,增加一个IndexController供测试使用. @Controller public class IndexController { @GetMapping( ...

  9. filter执行先后问题_filter的执行顺序是怎样的?

    1.引言 我们在编写javaweb程序的时候,时常会用filter这个组件,它能将我们一些通用逻辑抽取出来,在servlet执行业务逻辑之前运行, 达到简化代码和复用的目的.比如最常用的场景全站编码和 ...

最新文章

  1. 用宏定义代替printf函数
  2. Spring Cloud Eureka 自我保护机制
  3. 【数据结构与算法】之深入解析“用Rand7()实现Rand10()”的求解思路与算法示例
  4. 【SAS NOTE】substr函数
  5. 好看的极简网站导航源码自适应静态页
  6. 电脑格式化后需要重装系统吗_重装系统后c盘文件丢失,电脑重装系统后c盘文件能恢复吗...
  7. 曾有望成为第三大移动系统:如今正式告别,明日停止一切支持
  8. Linux 常用的IO接口
  9. 艾伟也谈项目管理,开始一个项目时最重要的是什么?
  10. 【每日算法Day 62】LeetCode 815. 公交路线
  11. VBOX+WINDOWSSERVER208R2实现虚拟机内FTP服务器搭建
  12. i.mx6ull uboot移植
  13. 下载各版本cuda,下载以前版本的cuda
  14. 最短哈密顿环 退火_模拟退火法计算最短路径 用 高效的 图论中哈密顿贿赂的 AI...
  15. html图片旁边加文字
  16. PHP中的PEAR是什么?
  17. Java POI 导入Excell
  18. Java中的XML解析
  19. 机器学习算法应用中常用技巧-1
  20. 悦诗风吟网络营销的目标_“悦诗风吟”品牌的促销策略研究

热门文章

  1. 都2039年了,还不会编译JDK源码?这篇文章该看看了~~
  2. html frame滚动条,如何修改 iframe 滚动条样式
  3. 聚集行业大咖的直播沙龙,将给缺乏顶流主播的《和平精英》带来什么?
  4. “你家娃为什么这么爱看书?”只用3招,孩子秒变小书迷
  5. Ubuntu20.04安装yum和yum-utils方法(原创)
  6. Python 操作windows的Wlan
  7. linux mint安装中文字体
  8. html5 语音唤醒,解锁小爱同学5种唤醒方式,如果你只会语音呼唤,手机白买了...
  9. 15 个有趣好玩的linux shell 命令
  10. (六十三)c#Winform自定义控件-箭头(工业)