一、拦截器是怎么实现:

实际上它是用Java中的动态代理来实现的

二、拦截器在Struts2中的应用 
对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。像params拦截器将http请求中参数解析出来赋值给Action中对 应的属性。Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递 给Action……struts2内置的拦截器有很多,在此我就不一一列举了。

那么怎么在struts2中定义自己的拦截器呢?

很简单Struts2为我们提供了一个Interceptor接口,该接口源代码如下:

publicinterface Interceptor extends Serializable {

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

1)    init():在拦截器执行之前调用,主要用于初始化系统资源。

2)    destroty():与init()对应,用于拦截器执行之后销毁资源。

3)    intercept():拦截器的核心方法,实现具体的拦截操作。与action一样,该方法也返回一个字符串作为逻辑视图。如果拦截器成功调用了 action,则返回一个真正的,也就是该action中execute()方法返回的逻辑视图,反之,则返回一个自定义的逻辑视图。

通常我们使用拦截器并不需要申请资源,为此Struts2还为我们提供了一个AbstractInterceptor类,该类的init()和destroy()都是空实现。我们开发自己的拦截器只需要继承这个类就行了。

下面创建一个判断用户是否登录的拦截器。代码如下:

import java.util.Map; 
import com.opensymphony.xwork2.Action; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

@SuppressWarnings("serial") 
public class CheckLoginInterceptor extends AbstractInterceptor {

@SuppressWarnings("unchecked") 
    public String intercept(ActionInvocation actionInvocation) throws Exception { 
         System.out.println("begin check login interceptor!");

// 检查Session中是否存在user

Map session = actionInvocation.getInvocationContext().getSession();

String username = (String) session.get("user");

if (username != null && username.length() > 0) {

// 存在的情况下进行后续操作。

System.out.println("already login!");

return actionInvocation.invoke();

} else {

// 否则终止后续操作,返回LOGIN

System.out.println("no login, forward login page!");

return Action.LOGIN;


        } 
    }

创建好拦截器后,还不能使用,还需要我们在struts.xml中配置一下。

下面看一下怎么配置拦截器。

<interceptors>

<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

</interceptors>

这个定义好的拦截器在Action中怎么使用呢?使用方法很简单,如下:

<action name=" " class=" " >

<result> </result>

<interceptor-ref name="checkLogin" />

</action>

一旦我们为某个action引用了自定义的拦截器,struts2默认的拦截器就不会再起作用,因此还需要引用默认拦截器。

<action name=" " class=" " >

<result> </result>

<interceptor-ref name="checkLogin" />

<interceptor-ref name="defaultStack" />

</action>

但是我们这么做似乎也不太方便,因为如果拦截器checkLogin需要被多个action引用的话,每一个都要配置一遍太麻烦了。我们可以把它定义成默认的拦截器。

<interceptors>

<interceptor name="checkLogin" class="com.myblog.interceptor.CheckLoginInterceptor" />

<!—-定义一个拦截器栈--> 
           <interceptor-stack name="mydefault">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="checkLogin" />

</interceptor-stack>

</interceptors>

<default-interceptor-ref name="mydefault" />

参数问题:即<param../>的使用:

系统为拦截器指定参数有两个时机:

1.定义拦截器时指定参数值(通过<interceptor .../>元素来定义拦截器,参数就是它下面的<param name="参数">参数值</param>):这种参数值是拦截器这个参数的默认数值。

2.使用拦截器时指定参数值(通过<interceptor-ref.../>元素来使用拦截器参数就是它下面的<param name="参数">参数值</param>):这种参数值是当在Action中使用该拦截器时动态分配的参数值。

无论在哪里里面配置,他的值都是传给拦截器类。

另外,struts2还为我们提供了一个方法过滤的拦截器MethodFilterInterceptor类,该类继承 AbstractInterceptor类,重写了intercept(ActionInvocation invocation)并提供了一个新的方法doInterceptor(ActionInvocation invocation)抽象方法。该类的使用方法很简单,跟上例类似,就不举例了。这个拦截器与以往的拦截器配置有所不同。那就是可以指定哪些方法需要被 拦截,那些不需要。通常在引用该拦截器时指定。

<interceptor-ref name="  ">

<param name="exculdeMethods"></param>

<param name="includeMethods"></param>

</interceptor-ref>

exculdeMethods:是不被拦截的方法,如果有多个以逗号分隔。 
includeMethods:需要被拦截的方法,如果有多个以逗号分隔。

上面两个参数,在MethodFilterInterceptor类中都有对应的方法。

如果一个方法同时在这两个方法中列出,则该方法会被拦截。

struts2中提供了这种方法过滤的拦截器有如下几个:

1.TokenInterceptor

2.TokenSessionStoreInterceptor

3.DefaultWorkflowInterceptor

4.ValudationInterceptor

三、覆盖特定拦截器的参数

<拦截器名>.<参数名>

<interceptor-ref name="my-stack">

<!--second为拦截器名,name为参数名-->

<param name="second.name">改名后的拦截器</param>

</interceptor-ref>

四、拦截结果的监听器

实现拦截结果的监听器首先必须现实com.opensymphony.xwork2.interceptor.PreResultListener类 
并重写里面的方法beforeResult :

public class MyListener implements PreResultListener {

public void beforeResult(ActionInvocation invocation, String resultCode) {

System.out.println(resultCode);

}

}

参数介绍:

1.虽然beforeResult方法也获得ActionInvocation类型的参数,但通过这个参数来控制Action的作用已经不再明显--因为Action的execute方法已经执行结束了。

2.resultCode,这个参数就是被拦截Action的execute方法的返回值。

然后再在拦截器里面调用

invocation.addPreResultListener(new MyListener());

拦截器结果监听器是在系统处理Result之前,在execute之后执行的。

注意:不要在PreResultListener监听器的beforeResult方法中通过ActionInvocation参数调用invoke方法。否则容易造成死循环。

(转)Struts 拦截器的更多相关文章

  1. [置顶] 使用struts拦截器+注解实现网络安全要求中的日志审计功能

    J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能: 1.项目中记录审计日志的方法. 2.struts拦截器的基本配置和使用方法. 3.struts拦截器中 ...

  2. 利用Struts拦截器限制上传图片的格式和大小

    在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...

  3. Struts拦截器设置完的值为什么在页面取不到

    Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...

  4. struts 拦截器 Interceptor

         拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...

  5. struts拦截器实现原理

    图1: 上1来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请 ...

  6. struts拦截器

    struts中的拦截器相当于过滤器的作用 一在struts.xml中配置拦截器或拦截器栈 <interceptors>!--全部的拦截器 <interceptor name=&quo ...

  7. struts——拦截器

    什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...

  8. Struts拦截器使用

    创建拦截器java程序 package cn.itcast.oa.util; import com.opensymphony.xwork2.ActionInvocation; import com.o ...

  9. 六 Struts 拦截器、OGNL表达式

    一.OGNL表达式1.概念:是表达式语言,专门用来访问对象取值用的.2.对比EL表达式使用场景: A.EL主要用在web的jsp页面取值 B.OGNL适用以下环境 1.java程序中 2.在页面使用( ...

随机推荐

  1. openerp经典收藏 对象的预定义方法(转载)

    对象的预定义方法 原文:http://shine-it.net/index.php/topic,2159.15.html 每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中 ...

  2. 1103. Integer Factorization (30)

    The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...

  3. 【js】 流式布局 页面

    <!DOCTYPE html><html><head> <meta content="text/html; charset=utf-8" ...

  4. MVC学习系列——HtmlHelper扩展

    微软自带很多HtmlHelper: ActionLink - 链接到操作方法.BeginForm  - 标记窗体的开头并链接到呈现该窗体的操作方法.CheckBox  - 呈现复选框.DropDown ...

  5. 屏蔽ios7中某个页面的默认手势滑回返回

    - (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:YES];self.navigationController.in ...

  6. Mysql几种索引类型的区别及适用情况

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...

  7. Google history

    传说,硅谷的公司在和微软的竞争中一直处于下风,不论在市场,人才,还是在打官司上,直到婴儿巨人Baby Giant谷歌的出现,历史才出现前所未有的改变.Google以一个强大的挑战者的身份出现在人们的视 ...

  8. NeatUpload 同时选择并上传多个文件

    neatUpload是asp.net 中可以同时上传多个文件的控件,主页:http://neatupload.codeplex.com/. 效果如下图(显示有点不正常...): 使用步骤: 1. 在a ...

  9. UEFI+GPT 修复 win10启动

    要修复引导文件大致有以下几个步骤(按照我自己修复的步骤来的,其他情况可结合上面参考资料探索,大体思路应该没有变化): 挂载ESP分区 由于我的windows8.1已经无法进入了,Ubuntu不知道能不 ...

  10. 【BZOJ】【3275】Numbers

    网络流/最小割 Orz了Jiry_2神犇,蒟蒻网络流建模什么的完全不会啊T_T 按奇偶性来分组实在太巧妙了……然后相关的点之间连边表示只能选其一,来求最小割…… /****************** ...