struts2进阶【6】——拦截器

原创 2015年03月31日 23:57:41

小解拦截器

        可以说,“拦截器”是Struts2的重点内容。见名知义,拦截器的作用主要就是拦截东西,拦截什么呢?当然是'action'了,在执行'action'之前 拦截器会起作用,执行一些预先处理的代码,接着去执行action中相关的方法,之后,流程又会回到拦截器里面,接着去执行后续的一些操作。

        在这里还要提两点:

        1. Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
        2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。



实现Struts2拦截器原理

        Struts 2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。动态代理是代理对象根据客户的需求做出不同的处理。对于客户来说,只要知道一个代理对象就行了。 
        那Struts2中,拦截器是如何通过动态代理被调用的呢?当Action请求到来的时候,会由系统的代理生成一个Action的代理对象,由这个代理对象调用Action的execute()或指定的方法,并在struts.xml中查找与该Action对应的拦截器。如果有对应的拦截器,就在Action的方法执行前(后)调用这些拦截器;如果没有对应的拦截器则执行Action的方法。其中系统对于拦截器的调用,是通过ActionInvocation来实现的。

        看一张简要的图


        拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。



代码举例

        1. 编写拦截器
        (1)  实现接口com.opensymphony.xwork2.Intercepter(或继承com.opensymphony.xwork2.AbstractInterceptor)
        (2)  在interceptor方法中加入如下代码:

public String intercept(ActionInvocation arg0) throws Exception {
   System.out.println("Before");   //在Action之前调用
   String result = arg0.invoke();  //如果此拦截器之后还有拦截器,则调用下个拦截器的intercept方法
                                   //如果之后没有了拦截器,则调用Action的execute方法
   System.out.println("After");
    return result;   
}
 
        2.在Struts.xml中配置拦截器
        (1)  在struts.xml中声明拦截器和拦截器Stack,拦截器Stack可以包括多个拦截器和其他Stack。
<interceptors>
<!-- 拦截器 -->
<interceptor name="MyInterceptor" class="com.test.interceptor.MyInterceptor"></interceptor>
<!-- 拦截器Stack -->
<interceptor-stack name="validationWorkflowStack">
<interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>

        (2)  将拦截器配置到单个Action中,只拦截此Action中的execute方法。
<action name="register" class="com.test.action.RegisterAction" method="test">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
<interceptor-ref name="MyInterceptor"></interceptor-ref>
</action>

        (3)  将拦截器配置到所有Action中,拦截所有Action中的execute方法。
<default-interceptor-ref name="MyInterceptor"></default-interceptor-ref>
        对已经单独配置了拦截器的Action不起作用
 
        3.拦截Action中指定的方法
        (1) 继承com.opensymphony.xwork2.interceptor.MethodFilterInterceptor。
        (2) 因为是针对某个Action的方法,所以只能配置在Action内部
<action name="register" class="com.test.action.RegisterAction" method="test">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
<interceptor-ref name="MyInterceptor">
   	<param name="includeMethod">test,execute</param> <!-- 拦截text和execute方法,方法间用逗号分隔 -->
   	<param name="excludeMethod">myfun</param>        <!-- 不拦截myfun方法 -->
</interceptor-ref>
</action>
 

        4. struts2拦截器的interceptor方法中,参数ActionInvocation可用来获取页面用户输入的信息。

public String intercept(ActionInvocation arg0) throws Exception {
    Map map = arg0.getInvocationContext().getSession();
    if(map.get("user") == null) {
        return Action.LOGIN;
    } else {
        return arg0.invoke();
    }
}


总之

        Struts2拦截器跟Servlet过滤器或JDK代理类是一样的。拦截器允许横切功能分开实现的动作,以及框架。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Struts2中的拦截器详解

拦截器是什么拦截器是一种可以在让用户在Action执行之前和Result执行之后进行一些功能处理的机制。 拦截器在action执行之前和result执行之后的顺序是相反的,可以看下图: 也就是说执...
  • u010870518
  • u010870518
  • 2015年05月24日 13:40
  • 3511

struts2默认各个拦截器的作用说明

 struts2默认各个拦截器的作用说明(1)在xml配置文件中配置拦截器和拦截器栈都是以“”开头,以“”结尾。 (2)配置拦截器的格式如上面代码所示以“”格式显示,其中两个属性name是...
  • u014449742
  • u014449742
  • 2014年04月15日 23:00
  • 3168

Struts2拦截器的使用心得和理解

一、先来说说在项目中遇到的问题:由于需要
  • a837199685
  • a837199685
  • 2014年06月26日 15:14
  • 3184

Struts2拦截器详解

成功的花儿,其间浸透了奋斗的泪水和汗水;然而,用泪水和汗水就可以实现一切的美好。Struts2拦截器概述 拦截器的概念是在Struts2里面有的。在其它地方没有。 Struts2是框架,封装了很多的功...
  • Marvel__Dead
  • Marvel__Dead
  • 2017年03月08日 09:17
  • 1564

【Struts2】:拦截器实现方法过滤

众所周知,我们在使用Struts2进行项目开发的时候,如果为某个Action配置拦截器,那么这个拦截器就会拦截该Action内的所有方法。但是在有些情况下,我们不需要拦截所有的方法,只想拦截指定的方法...
  • u010929604
  • u010929604
  • 2016年05月31日 16:32
  • 1775

防止未登录用户操作—struts2拦截器简单实现

一般我们的web应用都是只有在永固
  • zhutulang
  • zhutulang
  • 2014年08月02日 23:22
  • 46061

Struts2拦截器&拦截器栈 实例:登录验证拦截器

本篇源自 java1234小峰 尊重原创 热爱生活 Struts2 拦截器是在访问某个Action 或Action 的某个方法,字段之前或之后实施拦截,并且Struts2 拦截器是可 插拔的,拦截...
  • conglinyu
  • conglinyu
  • 2017年02月14日 22:02
  • 527

struts2 注解配置拦截器 实例

/** * */ package com.wonders.stpt.contractReview.action; import java.util.ArrayList; import jav...
  • z69183787
  • z69183787
  • 2014年08月08日 15:49
  • 10426

struts2的拦截器(5):继承MethodFilterInterceptor抽象类实现拦截方法的拦截器

在默认情况下,如果我们为某个Action定义了拦截器,则这个拦截器会拦截该Action内的所有方法。但在某些情况下,我们不想拦截所有的方法,我们只需要拦截某些特定方法,此时就需要使用struts2拦截...
  • confirmAname
  • confirmAname
  • 2013年07月03日 20:44
  • 1340

Struts2自定义登录验证拦截器

Controller.UserAction.java package Controller; import java.util.Map; import com.opensymphony.xwor...
  • u012997311
  • u012997311
  • 2016年01月04日 14:35
  • 662
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2进阶【6】——拦截器
举报原因:
原因补充:

(最多只允许输入30个字)