一、拦截器是怎么实现:

实际上它是用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. [转]PLS-S-00201, identifier 'CALLDEMO.GET_EMPLOYEES' must be declared 预编译错误原因及解决办法

    $ proc sample9.pc SQLCHECK=SEMANTICS Pro*C/C++: Release 11.2.0.1.0 - Production on Tue Jan 8 15:18:4 ...

  2. Leeo 智能夜灯:默默守护你的家

    http://www.ifanr.com/462377 Leeo 智能夜灯是一个低调的设备.它不需要你与之交互,也不会产生多余的费用.当你把它插到墙上插座,然后下载应用后,就不用再管它了.然后,它就开 ...

  3. 关于Resources.LoadAssetAtPath

    返回的是Object, 返回所在资源路径上的一个资源, 只能应用在unity的编辑器模式下,安卓等平台无效 static function LoadAssetAtPath (assetPath : s ...

  4. div+css登陆界面案例2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. DB天气app冲刺二阶段第九天

    今天是第九天了 不管怎么样也要收尾了赶紧,毕竟不可能做到尽善尽美了,时间不够了所以要把该砍掉的砍点,然后应对下周的大二同学的面试.尽量做好界面的美化工作这是最基本的了.毕竟我一直崇尚的就是UI设计了. ...

  6. JavaWeb常见错误总结

    错误1:(Ajax未加载问题) 今天我在学习AJAX的时候,想从一个JS文件中引入JQuery,然后在这个JS文件中使用AJAX的方法.结果V8引擎一直报错,错误类型是Uncaught Referen ...

  7. 一点ASP.NET MVC Html.Helper类的方法

    一点ASP.NET MVC Html.Helper类 这里就只写一个Html.ActionLink()和Html.DropdownList(). Html.ActionLink()里有三个参数,第一个 ...

  8. Query classification; understanding user intent

    http://vervedevelopments.com/Blog/query-classification-understanding-user-intent.html What exactly i ...

  9. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

  10. 【BZOJ】【1324】王者之剑

    网络流/二分图最大点权独立集 Amber(胡伯涛)论文<最小割模型在信息学竞赛中的应用>中的例题…… 感觉这个好神啊,果然是一切皆为网络流……这转化太神奇了 /************** ...