拦截器与过滤器_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2200 | 回复: 0   主题: 拦截器与过滤器        下一篇 
nengqiang.wang
注册用户
等级:中校
经验:1658
发帖:34
精华:0
注册:1970-1-1
状态:离线
发送短消息息给nengqiang.wang 加好友    发送短消息息给nengqiang.wang 发消息
发表于: IP:您无权察看 2015-8-6 16:34:46 | [全部帖] [楼主帖] 楼主

1 过滤器 
  过滤器是在JavaWeb中,在用户传入requst,response提前过滤掉一些信息,或者提前设置一些参数,然后在传入servlet或者struts的action进行业务逻辑,比如可以过滤掉非法的url(不是login.do的地址请求,如果用户没用登录都过滤掉),或者在传入servlet或者Struts的action前统一设置字符集,或者去掉一些非法字符。

创建一个Filter 只需两个步骤: 

(1)创建Filter 处理类: 

(2)在web.xml 文件中配置Filter 。 

创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。 

• void init(FilterConfig config): 用于完成Filter 的初始化。 

• void destroy(): 用于Filter 销毁前,完成某些资源的回收。 

• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。 

过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>该元素位于filter-mapping中。 

2 拦截器

   Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截。

(1)创建一个拦截器必须com.opensymphony.xwork2.interceptor.Interceptor接口,该接口声明了3个方法,void init();void destroy();String intercept(ActionInvocation invocation) throws Exception;

(2)init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,只要在struts.xml中声明了该Struts2拦截器就会被执行。intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。不过,struts中又提供了几个抽象类来简化这一步骤。

public abstract class AbstractInterceptor implements Interceptor;public abstract class MethodFilterInterceptor extends AbstractInterceptor;都是模板方法实现的。其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()方法;而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。一般来说,拦截器的写法都差不多。看下面的示例:

package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
      public void destroy() {
            // TODO Auto-generated method stub
      }
      public void init() {
            // TODO Auto-generated method stub
      }
      public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("Action执行前插入 代码");
            //执行目标方法 (调用下一个拦截器, 或执行Action)    
            final String res = invocation.invoke();
            System.out.println("Action执行后插入 代码");
            return res;
      }
}


(3)拦截器的配置

    Struts2拦截器需要在struts.xml中声明,如下struts.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor>
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="MyInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="loginAction" class="loginAction">
<result name="fail">/index.jsp </result>
<result name="success">/success.jsp</result>
<interceptor-ref name="myInterceptorStack"></interceptor-ref>
</action>
</package>
</struts>


3 过滤器域拦截器的区别

(1)拦截器是基于Java反射机制的,而过滤器是基于函数回调的。

(2)拦截器不依赖与servlet容器,过滤器依赖servlet容器。

(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有请求起作用。

(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

(5)在action生命周期中,拦截器可以多次被调用,而过滤器智能在容器初始化的时候被调用一次

(6)Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤。



人们都向往和寻找快乐,其实快乐就是一种心情,秘密隐藏于人的心中。快乐从不曾远离我们,而是我们远离了快乐。原本单纯的心,一旦复杂起来,快乐和幸福就 会远离而去,烦恼和忧愁就会随之而来。






赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论