java-filter 工作原理、调用规则顺序及与servlet的关系

java-filter 工作原理、调用规则顺序及与servlet的关系


一、filter 是什么?作用?
简单来说 filter 是一个请求进入 servlet 处理前、后都被调用的筛选器。
调用前对 request 对象进行处理,调用后对 response 对象进行处理。
作用:
1>请求到达 servlet 前对 request 进行预处理,可以截断请求使之不能到达 servlet ;
2>对servlet 处理后的内容进行编辑、修改;


顺便说下 servlet ,服务器上的任何资源(图片、css、js、jsp等)都将被封装成一个 servlet 实例,
通过 doGet()/doPost() 之类的方法将资源加载到 response 对象中返回到客户端;


二、filter 的工作原理
多个 filter 是如何工作的,如何修改request、response 对象的呢?
那要从 filter 的数据结构上说,从数据结构上讲 filter 像是一个链表的结构,filter 通过 dofilter() 
方法将处理指针交到链表的下一个节点进行处理,直到链表的最后一个 filter 执行完后,才将请求交给 
servlet 实例进行处理;servlet 处理完后在通过调用链接向上反推回去;说的比较抽象写个伪代码说明下就一目了然了。


三、filter 工作原理伪代码描述,说明 servliet 、 filter 调用的逻辑关系,及执行顺序
自定义的 Filter 都需要重写 doFilter(ServletRequest request, ServletResponse response, FilterChain filter) 这个方法,
这个方法是完成调用链的重要一环。
1.定义
容器:代表一个 web 容器,如 tomact 等;
servlet:自定义的一个 servlet 对象;
filter:自定义的filter对象;


2.假设 web.xml 中定义了 3 个 filter
<web-app>
    <filter>  
		<filter-name>filter1</filter-name>  
    </filter>
    <filter>  
		<filter-name>filter2</filter-name>  
    </filter>
    <filter>  
		<filter-name>filter3</filter-name>  
    </filter>
</web-app>




3.容器加载filter,加载顺序就是按照 web.xml 中出现顺序加入队列的,可以用一个 list 数组表示:
List<Filter> filters = new List<Filter>();
filters.add(filter1);
filters.add(filter2);
filters.add(filter3);




4.容器逐一执行 filter 到最后一个 filter处理完后,将请求交由 servlet 处理,之后逐级向上返回,一个递归调用

public class 容器{
	Request _request;
	Response _response;
	Servlet _servlet;
	List<Filter> _filters;
	int index=0;
	public 容器构造函数(){
		Filter f = _filters[index];
		doFilter(_request,_response,f);	
	}
	//递归调用
	public void doFilter(Request request,Response response,Filter filter){
		//回归点
		if(filter==null){
			//调用 servlet 处理get请求
			servlet.doGet(request,response);
			return;
		}
		index++;
		Filter f = _filters[index];//下一个调用的 filter 实例
		filter.doFilter(request,response,f); //递归调用
	}
}



通过以上表述,filter 与 servlet 的结构应该比较清晰了,可以大概了解 filter 对 servlet 的关系,

暂时还没分析过servlet的源码,以上只是个人理解!!!





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值