一、拦截器是怎么实现:

实际上它是用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方法。否则容易造成死循环。

struts2拦截器+监听器 .的更多相关文章

  1. Struts2拦截器登录验证

    Struts2拦截器 Struts2拦截器的概念和Spring Mvc拦截器一样. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截 ...

  2. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...

  3. struts2动态调用+Servlet过滤器+struts2拦截器

    周末真的是懒到心慌...... 本文是在完整s2sh项目基础上添加的,不太了解s2sh项目构建的朋友可以先参考一下这几篇文章: eclipse环境下基于tomcat-7.0.82构建struts2项目 ...

  4. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  5. struts2 拦截器

    拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...

  6. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  7. struts2拦截器

    一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...

  8. Struts2拦截器模拟

    前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...

  9. Struts2拦截器初涉

    Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...

随机推荐

  1. [译]git init

    git init git init命令用来创建一个新的Git仓储.可以用在一个已经存在的但是没有受Git版本控制的项目,或者用来初始化一个全新的没有任何文件的空仓储.git init通常是你开始一个新 ...

  2. 【AngularJS】—— 10 指令的复用

    前面练习了如何自定义指令,这里练习一下指令在不同的控制器中如何复用. —— 来自<慕课网 指令3> 首先看一下一个小例子,通过自定义指令,捕获鼠标事件,并触发控制器中的方法. 单个控制器的 ...

  3. 基础知识系列☞C#中数组Array、ArrayList和List三者的区别

    数组() #region 数组 //初始化方式_0:先声明再赋值 ]; weekDays_0[] = "Sun"; weekDays_0[] = "Mon"; ...

  4. uva.10020 Minimal coverage(贪心)

    10020 Given several segments of line (int the X axis) with coordinates [Li, Ri]. You are to choose t ...

  5. mysql数据库性能调优总结积累

    mysql数据库的调优大概可以分为四大块 0 架构调优 ---根据业务 读写分库分表   ---主从 读写分离 1 配置的调优 ---开启缓存查询  设置缓存大小 ---最大连接数设置 ---数据库引 ...

  6. leofs存储总结

    1.leofs角色 Account(账户).Bucket(对象桶).Object(对象), gateway.manager0.manager1.storage Account 一个account可以创 ...

  7. 深入理解 CSS3 弹性盒布局模型

    Web 应用的样式设计中,布局是非常重要的一部分.布局用来确定页面上不同组件和元素的尺寸和位置.随着响应式用户界面的流行,Web 应用一般都要求适配不同的设备尺寸和浏览器分辨率.响应式用户界面设计中最 ...

  8. plsql 建立oracle作业

    --.plsql中学习job --学习job --建表 create table test_job(para_date date); commit; insert into test_job valu ...

  9. php访问全局变量

    函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. PHP 同时在名为 $GLOBALS[index] 的数组 ...

  10. HDU 4927 Series 1(高精度+杨辉三角)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 解题报告:对于n,结果如下: C(0,n-1) *A[n] - C(1,n-1) * A[n-1 ...