Filter的FilterChain执行顺序
当使用多个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执行顺序相关推荐
- Filter过滤器链执行顺序
Web应用允许多个过滤器来过滤页面请求--联想现实生活中的例子是最好理解的啦!比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤. 这个时候就分为两种情况了 1:多个过滤器过滤的URL不同,那么 ...
- JavaWeb——多个Filter代码的执行顺序
转载于:https://www.cnblogs.com/yangHS/p/11195358.html
- WEB API 系列(二) Filter的使用以及执行顺序
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don't Repeat Yourself)思想 ...
- WEB API Filter的使用以及执行顺序
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don't Repeat Yourself)思想 ...
- nginx开发_Filter模块执行顺序
Filter模块执行顺序 Filter模块的执行顺序是在执行configure文件时决定的,configure文件执行完成后生成objs/ngx_modules.c,文件中定义了一个数组ngx_mod ...
- java 过滤器执行图_「filterchain」java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序 - seo实验室...
filterchain 过滤器拦截到请求之后,首先是执行doFilter()方法中chain.doFilter()之前的代码,然后放弃权限给下一个过滤器或者serverlet等等,最后才执行chain ...
- 验证多个Filter过滤一个资源时执行顺序
当有多个Filter过滤一个资源时,执行顺序到底是怎样? 如下测试: 定义两个Filter,FirstFilter,SecondFilter,它们过滤同一个index.jsp页面,并且SecondFi ...
- 排队器拦截_过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
首先建立一个SpringBoot工程,增加一个IndexController供测试使用. @Controller public class IndexController { @GetMapping( ...
- filter执行先后问题_filter的执行顺序是怎样的?
1.引言 我们在编写javaweb程序的时候,时常会用filter这个组件,它能将我们一些通用逻辑抽取出来,在servlet执行业务逻辑之前运行, 达到简化代码和复用的目的.比如最常用的场景全站编码和 ...
最新文章
- 用宏定义代替printf函数
- Spring Cloud Eureka 自我保护机制
- 【数据结构与算法】之深入解析“用Rand7()实现Rand10()”的求解思路与算法示例
- 【SAS NOTE】substr函数
- 好看的极简网站导航源码自适应静态页
- 电脑格式化后需要重装系统吗_重装系统后c盘文件丢失,电脑重装系统后c盘文件能恢复吗...
- 曾有望成为第三大移动系统:如今正式告别,明日停止一切支持
- Linux 常用的IO接口
- 艾伟也谈项目管理,开始一个项目时最重要的是什么?
- 【每日算法Day 62】LeetCode 815. 公交路线
- VBOX+WINDOWSSERVER208R2实现虚拟机内FTP服务器搭建
- i.mx6ull uboot移植
- 下载各版本cuda,下载以前版本的cuda
- 最短哈密顿环 退火_模拟退火法计算最短路径 用 高效的 图论中哈密顿贿赂的 AI...
- html图片旁边加文字
- PHP中的PEAR是什么?
- Java POI 导入Excell
- Java中的XML解析
- 机器学习算法应用中常用技巧-1
- 悦诗风吟网络营销的目标_“悦诗风吟”品牌的促销策略研究
热门文章
- 都2039年了,还不会编译JDK源码?这篇文章该看看了~~
- html frame滚动条,如何修改 iframe 滚动条样式
- 聚集行业大咖的直播沙龙,将给缺乏顶流主播的《和平精英》带来什么?
- “你家娃为什么这么爱看书?”只用3招,孩子秒变小书迷
- Ubuntu20.04安装yum和yum-utils方法(原创)
- Python 操作windows的Wlan
- linux mint安装中文字体
- html5 语音唤醒,解锁小爱同学5种唤醒方式,如果你只会语音呼唤,手机白买了...
- 15 个有趣好玩的linux shell 命令
- (六十三)c#Winform自定义控件-箭头(工业)