什么是拦截器

拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过)、转换器,校验等。

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

说到拦截器有一个东西不 能落下——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

实现原理

Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

Struts 2提供了丰富多样的,功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

相关说明如下:

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value来是指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

将Action状态存入session和application的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

从struts.xml文件中将中的中的内容设置到对应的Action中。

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过Token来避免双击

Token Session Interceptor

tokenSession

和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

Validation Interceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

在struts.xml中添加如下配置:

<!-- 配置全局拦截器 -->

<package name="all" extends="struts-default">
        <interceptors>
            <!-- 定义权限控制拦截器 -->
            <interceptor name="authority"
                class="akai.cost.ms.base.AuthInterceptor" />
            <!-- 定义一个包含权限控制的拦截器栈 -->
            <interceptor-stack name="mydefault">
                <interceptor-ref name="defaultStack" />
                <interceptor-ref name="authority" />
            </interceptor-stack>
        </interceptors>
        <!-- 定义默认拦截器 -->
        <default-interceptor-ref name="mydefault" />
        <!-- 定义全局处理结果 -->
        <global-results>
            <!-- 逻辑名为login的结果,映射到/login.jsp页面 -->
            <result name="login">/login.jsp</result>
        </global-results>

</package>

使用方法:其他包继承这个包名就可以了

<package name="abc" extends="all" namespace="/">

附:拦截器类

    1. package akai.cost.ms.base;
    2. import javax.servlet.http.HttpSession;
    3. import org.apache.struts2.ServletActionContext;
    4. import com.opensymphony.xwork2.Action;
    5. import com.opensymphony.xwork2.ActionInvocation;
    6. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    7. public class AuthInterceptor extends AbstractInterceptor{
    8. @Override
    9. public String intercept(ActionInvocation invocation) throws Exception {
    10. HttpSession session = ServletActionContext.getRequest().getSession();
    11. String userName = (String)session.getAttribute("System_UserName");
    12. if(userName == "" || userName == null){//错误,回到登录界面
    13. return Action.LOGIN;
    14. }else{
    15. return invocation.invoke();
    16. }
    17. }
    18. }
    19. 或者:
    20. 定义拦截器
      1. <package name="MyInterceptor" extends="struts-default" namespace="/">
      2. <interceptors>
      3. <!-- 配置拦截器 -->
      4. <interceptor name="拦截器名" class="拦截器实现类完整路径"/>
      5. <!-- 配置拦截器栈 -->
      6. <interceptor-stack name="拦截器栈名">
      7. <interceptor-ref name="拦截器一"/>
      8. <interceptor-ref name="拦截器二"/>
      9. ...................................
      10. </interceptor-stack>
      11. </interceptors>
      12. </package>
      将拦截器配置到action
      1. <action name="login" class="com.action.LoginAction">
      2. <result name="success">/success.jsp</result>
      3. <result name="error">/error.jsp</result>
      4. <!-- 引用拦截器,一般配置在result后面 -->
      5. <interceptor-ref name="拦截器名或拦截器栈名"/>
      6. <!-- 引用Struts默认拦截器 -->
      7. <interceptor-ref name="defaultStack"/>
      8. </action>

      需要注意的是,必须要引用Struts默认的拦截器,否则会报错。

      实现自定义拦截器:
      通过实现接口com.opensymphony.xwork2.interceptor.Interceptor可自定义拦截器。该接口提供了三个方法:
      1)  void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
      2)  void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。
      3)  String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。
      除此之外,通过继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor等方法也可自定义拦截器,这里不过多介绍。
      拦截器实例
      自定义拦截器MyInterceptor,实现Interceptor接口
      1. package com.interceptor;
      2. import java.util.Map;
      3. import com.opensymphony.xwork2.ActionInvocation;
      4. import com.opensymphony.xwork2.interceptor.Interceptor;
      5. import com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod;
      6. public class MyInterceptor implements Interceptor {
      7. @Override
      8. public void destroy() {
      9. System.out.println("---------destroy()---------");
      10. }
      11. @Override
      12. public void init() {
      13. System.out.println("---------init()---------");
      14. }
      15. @Override
      16. public String intercept(ActionInvocation invocation) throws Exception {
      17. System.out.println("---------intercept()---------");
      18. Map session = invocation.getInvocationContext().getSession();
      19. if (session.get("username") != null) {
      20. return invocation.invoke();
      21. } else {
      22. return "login";
      23. }
      24. }
      25. }
      拦截器的配置
      1. <?xml version="1.0" encoding="UTF-8" ?>
      2. <!DOCTYPE struts PUBLIC
      3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
      4. "http://struts.apache.org/dtds/struts-2.0.dtd">
      5. <struts>
      6. <constant name="struts.action.extension" value=","></constant>
      7. <package name="testLogin" namespace="/" extends="struts-default"  >
      8. <interceptors>
      9. <interceptor name="MyInterceptor" class="com.interceptor.MyInterceptor"></interceptor>
      10. <interceptor-stack name="defaultInterceptorStack">
      11. <interceptor-ref name="MyInterceptor"></interceptor-ref>
      12. <interceptor-ref name="defaultStack"></interceptor-ref>
      13. </interceptor-stack>
      14. </interceptors>
      15. <!--配置默认拦截器,所有该包内的action如果没有单独配置拦截器,则默认执行默认拦截器-->
      16. <default-interceptor-ref name="defaultInterceptorStack"></default-interceptor-ref>
      17. <action name="login" class="com.action.LoginAction">
      18. <result name="success" type="redirect">/success.jsp</result>
      19. <result name="error" type="redirect">/error.jsp</result>
      20. <result name="login">login.jsp</result>
      21. </action>
      22. </package>
      23. </struts>

      annoction注解中使用拦截器和拦截栈

      1 //直接在类名称的上端写入即可,value中指定要引入的拦截器的名称即可
      2 @InterceptorRef(value="token")
      3 //拦截栈的引用,蓝色字体即拦截栈的引用名称
      4 @InterceptorRefs(@InterceptorRef("sessionCheckStack"))

      进入系统的时候,拦截器检查是否登录,如未登录,转到登录页;如已登录,转到成功页。
      拦截器是Struts 2比较重要的一个功能。通过正确地使用拦截器,我们可以编写可复用性很高的代码。

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 拦截器

    一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...

  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. SWTBOK測试实践系列(4) -- 软件測试技术的黑白之道

    白盒測试和黑盒測试往往是项目中最受争议的两种測试类型,每一个人偏爱各不同.现实生活中行业人员大多喜欢白盒測试而忽视黑盒測试,那么项目中又应该怎样平衡这两类測试呢?我们先来看两个案例. 案例一: 某移动 ...

  2. UVa 10701 - Pre, in and post

    题目:已知树的前根序,中根序遍历转化成后根序遍历. 分析:递归,DS.依据定义递归求解就可以. 前根序:根,左子树,右子树: 中根序:左子树,根,右子树: 每次,找到根.左子树.右子树,然后分别递归左 ...

  3. Linux多任务编程——进程

    进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...

  4. vim的用法

    1. vi 与 vim 有什么区别呢,它们之间有什么关系?Vim是从Vi发展出来的一个文本编辑器,可以看作是vi的升级版.Vim的主要功能与原始的Vi完全兼容,vi不会显示颜色,而vim会根据文件内容 ...

  5. EF中的连接字符串

    映射视图是每个实体集和关联的映射中指定的可转换的可执行表示. 包括两部分: 查询视图 表示从数据库架构转到概念架构所需的规范装换 更新视图 表示从概念模型转到数据库架构所需的规范转换 如果应用程序仅用 ...

  6. MySQL percona-toolkit工具包的使用教程

    percona-toolkit工具包的使用教程之介绍和安装http://blog.chinaunix.net/uid-20639775-id-3206802.htmlpercona-toolkit工具 ...

  7. java实现简单的单点登录

    java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...

  8. javascript中0级DOM和2级DOM事件模型浅析

    Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...

  9. Git / Bower Errors: Exit Code # 128 & Failed connect

    今天第一次使用bower来安装插件,上来就报了这个错. 然后在google上查找,很多人都有做出回答,让执行如下 git config --global url.https://github.com/ ...

  10. Win7中,取消共享文件夹后有个小锁

    用过windows7的朋友都知道,Windows 7 中设置某一个文件夹属性为共享后,文件夹的图标上就增加一个小锁图案.起到了一个标记作用,挺好的.但是即使你将该文件夹的共享功能取消后,该小锁图案还是 ...