`
congpeixue
  • 浏览: 275537 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

struts2 拦截器

阅读更多
引用
默认的的拦截器栈被设计成能满足大部分应用的需要,所以不再需要添加新的拦截器或更改拦截器栈。


不同的action可能有不同的关注点, 一些action需要表单验证,一些action需要文件上传功能,一些action需要防止双重提交……struts框架使用“Interceptor”策略使得解决这些关注点变得容易。

理解拦截器

在action执行前后interceptor都要被执行。框架的大部分核心功能(包括类型转化,防止双重提交等……)都是借助拦截器来实现的。 所有的拦截器都是插件式的,你可以为你的action精确的设置需要的拦截器。

action生命周期

配置拦截器
<package name="default" extends="struts-default">
   <interceptors>
       <interceptor name="timer" class=".."/>
       <interceptor name="logger" class=".."/>
   </interceptors>

   <action name="login"
      class="tutorial.Login">
        <interceptor-ref name="timer"/>
        <interceptor-ref name="logger"/>
         <result name="input">login.jsp</result>
         <result name="success"
            type="redirect-action">/secure/home</result>
   </action>
</package>



拦截器栈

在大部分web程序中,我们发现需要屡次使用相同的拦截器序列。 此时, 我们可以把这些拦截器序列绑定为一个拦截器栈,而无需重申这些拦截器列表。
<package name="default" extends="struts-default">
   <interceptors>
        <interceptor name="timer" class=".."/>
        <interceptor name="logger" class=".."/>
        <interceptor-stack name="myStack">
           <interceptor-ref name="timer"/>
           <interceptor-ref name="logger"/>
        </interceptor-stack>
    </interceptors>

<action name="login"
     class="tutuorial.Login">
         <interceptor-ref name="myStack"/>
         <result name="input">login.jsp</result>
         <result name="success"
             type="redirect-action">/secure/home</result>
</action>
</package>



几个重要的拦截器
在struts配置文件中,拦截器类被定义为键值对的形式。
拦截器的名字在 struts-default.xml中都进行了定义,如果你继承了 struts-default.xml包,后面的操作你可以通过引用来使用拦截器;如果没有继承struts-default.xml,你需要在<interceptors>中指定名字和名字对应的拦截器类来引用拦截器。


  • chain  : 使上一个action的属性能在当前的action中有效
  • execAndWait  : 生成一个新的线程以执行action, 然后返回wait作为result code。而wait这个code可以映射至一张包含刷新指示的页面,告知浏览器每隔数秒自动刷新。当新线程执行action完毕之后,下一个来自浏览器到请求将返回原始action调用所生成的result。
  • exception  : 映射一个异常页面。 一般情况下,应该为最后一个拦截器。
  • fileUpload : 处理文件上传。
  • logger : 记录用于追踪的信息(可位于拦截器序列的不同位置)。
  • params:使用request参数设置action的属性。request参数会被映射到action中与之同名的属性。
  • static-params :将配置文件中参数设置到action实例中。
  • prepare : 此拦截器将调用实现了Preparable的action中的prepare方法。
  • token : 检查表单中的合法令牌,当表单被多次提交时,跳转到一个错误页面。
  • tokenSession :类似于token, 只是不跳转到错误页面,再次生成与第一次相同的页面。
  • validation  : 调用校验框架读取*-validation.xml文件并且应用在这些文件中声明的校验。
  • workflow  :为action定义默认的工作流, 一般跟在validation等其它拦截器后。
  • timer : 计算ActionInvocation余下部分执行的时间并记录下来。


从2.0.7版本后拦截器和Result中含有的连字符号都被转化为来骆驼格式。
如:(model-driven 被转化为modelDriven)。
直到Struts 2.1.0, 原有的连字符号格式以别名的形式仍被使用。


方法过滤 覆写拦截器参数
一个抽象的过滤器被用于过滤方法的名字。
excludeMethods : 不被包含的方法的名字。
includeMethods : 包含的方法的名字。
如果方法的名字在excludeMethods和includeMethods都适合, 那么将包含方法的名字, includeMethods比excludeMethods的
优先级高。

方法1
<action name="myAction" class="myActionClass">
  <interceptor-ref name="exception"/>
    <interceptor-ref name="alias"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="servlet-config"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="i18n"/>
    <interceptor-ref name="chain"/>
    <interceptor-ref name="model-driven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="static-params"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
      <param name="excludeMethods">myValidationExcudeMethod</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
      <param name="excludeMethods">myWorkflowExcludeMethod</param>
    </interceptor-ref>
</action>


方法2
<action name="myAction" class="myActionClass">
  <interceptor-ref name="defaultStack">
    <param name="validation.excludeMethods">myValidationExcludeMethod</param>
    <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
  </interceptor-ref>
</action>



拦截器的执行顺序

拦截器提供了一种对处理前后进行包装的思想, 这种观念大大减少了代码副本。(参考AOP)
<interceptor-stack name="xaStack">
  <interceptor-ref name="thisWillRunFirstInterceptor"/>
  <interceptor-ref name="thisWillRunNextInterceptor"/>
  <interceptor-ref name="followedByThisInterceptor"/>
  <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>

一些拦截器有可能会打断执行流程,因此拦截器的顺序也是很重要的 。

另, 实现了com.opensymphony.xwork2.interceptor.PreResultListener 的拦截器将在Action执行之后和Result返回之前调用。
thisWillRunFirstInterceptor
  thisWillRunNextInterceptor
    followedByThisInterceptor
      thisWillRunLastInterceptor
        MyAction1
        MyAction2 (chain)
        MyPreResultListener
        MyResult (result)
      thisWillRunLastInterceptor
    followedByThisInterceptor
  thisWillRunNextInterceptor
thisWillRunFirstInterceptor


自定义拦截器

自定义拦截器必须实现 com.opensymphony.xwork2.interceptor.Interceptor
public interface Interceptor extends Serializable {

    void destroy();

    void init();

    String intercept(ActionInvocation invocation) throws Exception;
}


在拦截器被实例化之后和 intercept方法被调用之前 执行init方法。 此方法用来初始化拦截器需要的资源。
拦截器的主体代码写在intercept中, 和action类似, intercept返回一个result, result被struts2用于将请求转发到另一个资源,调用ActionInvocation 中的invoke 方法以执行action (如果是最后一个拦截器)或调用另一个拦截器。
在result被调用之后方法才返回, 这种情况适合open-session-in-view模式。 如果你想在result被调用之前做一些事情,你必须实现PreResultListener。

拦截器必须是线程安全的
对于struts2, 每个请求都会实例化一个action, 所以action不需要线程安全。 但是, 拦截器会在请求之间共享,所以,
拦截器必须线程安全。


分享到:
评论
10 楼 kjj 2009-02-08  
struts2 也就是webwork 作为contrller层一个流行已久用来代替servlet  的框架,servlet 都能够解决这个问题,他能有这个bug?,担心是多余的!
9 楼 cqddklx 2009-02-06  
其实我看过struts2的源码,是整个应用中一个实例,但是我比较不解的是,如果是这样,那通过param设置的静态值不是有并发问题。
所以报着这个疑问来问这个问题。
8 楼 cqddklx 2009-02-06  
kjj 写道
当然是不同的实例了,每一个请求都有actioncontext 不同

每个actioncontext是放在ThreadLocal里的,当然是每次都有。
而拦截器并不是。所以我才这样问的。
7 楼 wangneng_001 2009-02-06  
拦截器应该是单例的吧。。。
6 楼 kjj 2009-02-06  
当然是不同的实例了,每一个请求都有actioncontext 不同
5 楼 cqddklx 2009-02-05  
拦截器会在请求之间共享,所以,
拦截器必须线程安全。

我想问下,拦截器是每个action一个实例,还是整个应用一个实例?
例如:
拦截器A,
在a这个action和b这个action上都有配置,那么,是A这个拦截器对于a和b都有单独的实例,还是a和b都是同一个实例(整个应用一个实例)
4 楼 congpeixue 2008-09-05  

引用
popbao_haha 9 小时前
其实struts有个自己默认的Interceptor拦截器设置。这些基本设置一般都能够满足项目需求了。
具体的参看xwork.jar包中的xwork-default.xml文件。


关于拦截器的默认配置文件:
xwork-2.0.4.jar    : xwork-default.xml
struts2-core-2.0.9 : struts-default.xml
webwork-2.2.6      : webwork-default.xml
3 楼 congpeixue 2008-09-05  
引用
smallsnake 21 小时前
一个小问题,要是我在每个action中都要使用同一个Intercepter,那我岂不是要在每个action中配置拦截器,所有怎样在struts.xml配置一个全局的Intercepter????



可以在package中设置默认的拦截器:
<default-interceptor-ref name="normal" />
之后,在action中会自动调用。 例:


  <package name="manage-project-default" extends="manage-default" namespace="/project">
    <default-interceptor-ref name="normal" />
...
2 楼 popbao_haha 2008-09-05  
其实struts有个自己默认的Interceptor拦截器设置。这些基本设置一般都能够满足项目需求了。
具体的参看xwork.jar包中的xwork-default.xml文件。
1 楼 smallsnake 2008-09-04  
一个小问题,要是我在每个action中都要使用同一个Intercepter,那我岂不是要在每个action中配置拦截器,所有怎样在struts.xml配置一个全局的Intercepter????

相关推荐

    Struts2拦截器及其用法详细说明

    在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...

    struts2拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    详解Struts2拦截器

    ### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    Struts2拦截器实现权限控制demo

    在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...

    struts2拦截器的使用方法

    ### Struts2拦截器的使用方法 #### 一、Struts2拦截器概述 Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活...

    struts2拦截器应用小例子

    当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...

    Struts2拦截器.ppt

    Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt

    Struts2拦截器原理分析

    拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    Struts2 拦截器注解(二十七)

    拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...

    Struts2 拦截器的执行顺序(二十九)

    这篇博客“Struts2 拦截器的执行顺序(二十九)”可能探讨了Struts2拦截器链的工作原理和它们的执行顺序,这对于理解Struts2的内部机制至关重要。 首先,让我们深入理解Struts2的拦截器。拦截器是在Action调用前后...

    struts2 拦截器实现登录控制

    这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...

    struts2拦截器和验证框架(适合初学者-经藏版)

    ### Struts2 拦截器与验证框架详解 #### 一、Struts2概述 Struts2是一个基于Java的企业级Web应用开发框架,它继承了Struts1的优点,并在此基础上进行了很多改进,使得开发更加灵活高效。Struts2的核心是拦截器...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

Global site tag (gtag.js) - Google Analytics