本文主要是介绍filter与interceptor的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.1 filter
1. 作用:“取你所想取,拒你所想拒”
首先对用户的请求进行预处理,紧接着将请求交给servlet进行处理并相应,最后filter在对服务器响应进行后处理。
1. 应用案例:对用户的请求设置编码字符集,非法请求,权限设置,是否登录等操作。
2. 生命周期:
随着web服务器的启动而启动,只初始化一次,以后就可以过滤相关请求,随着web的应用的停止而销毁。
3. 使用方法:
1. 在web.xml进行配置;
2. 自定义自己的filter实现类,重写有三个方法:
Init():实现初始化方法;
Dofilter():执行过滤的核心方法;
Destroy():执行销毁方法。
多个匹配的Filter,是按照其在web.xml中配置的顺序来执行的
1.2 Interceptor
1. 拦截器是AOP实现的一种策略,在AOP中用于在访问某个方法或字段之前,进行拦截,在执行之前或之后加入某些处理。
当你提交对Action(默认是.action结尾的url)的请求时,ServletDispatcher会根据你的请求,去调度并执行相应的Action。在Action执行之前,调用被Interceptor截取,Interceptor在Action执行前后执行。
1. 三个方法:
Init():初始化资源。
Interceptor():实现用户的拦截动作;
Destroy():资源的销毁。
1.3 两者的比较
1. filter基于函数回调,interceptor基于java反射机制;
2. filter依赖于servlet容器;interceptor不依懒于servlet容器;
3. filter对所有的请求进行过滤,interceptor只对action请求起作用。
4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
5在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
1.4 Filter和interceptor的执行顺序
过滤前-拦截前-action执行-拦截后-过滤后
1.5 Web.xml的执行顺序
web.xml 的加载顺序是:context-param -> listener -> filter -> servlet
2 案例
1. http://localhost:8080/testFilter访问index.jsp
1.index.jsp:
2.myfilter:
3.myfirstServlet
4. 后台执行结果:
6. 分析流程:
输入:http://localhost:8080/testFilter访问index.jsp
1.执行web.xml中: <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
先访问index.jsp
1. 进入filter:
/index.jsp
执行....doFilter之前
执行....doFilter之后
跳到index.jsp
2. 跳到index.jsp页面执行js中的ready方法,执行/toLogin请求
3. 再次跳到filter:
/toLogin
执行....doFilter之前
5.执行第一个if块中的语句;跳转到MyFirstServlet;
我来了
4. 执行完MyFirstServlet,跳出dofilter,跳到filer:
执行....doFilter之后
5. 跳到index.jsp并返回参数data;
3.案例
//执行过滤的核心方法
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException
{
//---------下面代码用于对用户请求执行预处理---------
//获取ServletContext对象,用于记录日志
ServletContext context = this.config.getServletContext();
long before = System.currentTimeMillis();
System.out.println("开始过滤...");
//将请求转换成HttpServletRequest请求
HttpServletRequest hrequest = (HttpServletRequest)request;
//记录日志
context.log("Filter已经截获到用户的请求地址: " + hrequest.getServletPath());
//Filter只是链式处理,请求依然放行到目的地址
chain.doFilter(request, response);
//---------下面代码用于对服务器响应执行后处理---------
long after = System.currentTimeMillis();
//记录日志
context.log("过滤结束");
//再次记录日志
context.log("请求被定位到" + hrequest.getRequestURI() + "所花的时间为: " + (after - before));
}
上面程序实现了doFilter()方法,实现该方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理——它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
在上面的请求Filter中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter(request,reponse)方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,reponse)方法。
在web.xml中配置多个filter时候,执行顺序:
<filter-mapping>
<filter-name>secondFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
那个filter-mapping配置在前,就先执行那个filter
filter链的执行流程:
参考网址:http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html
这篇关于filter与interceptor的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!