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

来源:互联网 发布:js newdate 编辑:程序博客网 时间:2024/06/07 16:26
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的源码,以上只是个人理解!!!





0 0
原创粉丝点击