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
3.容器加载filter,加载顺序就是按照 web.xml 中出现顺序加入队列的,可以用一个 list 数组表示:
4.容器逐一执行 filter 到最后一个 filter处理完后,将请求交由 servlet 处理,之后逐级向上返回,一个递归调用
通过以上表述,filter 与 servlet 的结构应该比较清晰了,可以大概了解 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的源码,以上只是个人理解!!!