拦截器(Interceptor)是 Struts 2 的核心组成部分。

  1. Struts2 很多功能都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、数据类型转换和数据校验等等。
  2. Struts2 拦截器在访问某个 Action 方法之前或之后实施拦截 Struts2 拦截器是可插拔的, 拦截器是 AOP(面向切面编程) 的一种实现.
  3. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时,
  4. Struts2 拦截器链中的拦截器就会按其之前定义的顺序被依次调用

下面说明了栈的调用次序:

 <package name="default" extends="struts-default">
<!--配置拦截器-->
<interceptors>
<interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor">
<param name="value" >YEN</param>
</interceptor>
<interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor>
        //次序为 FirstInterceptor==》SecondInterceptor===》defaultStack===》SecondInterceptor====》FirstInterceptor
<interceptor-stack name="AllInterceptor">
<interceptor-ref name="FirstInterceptor"></interceptor-ref>
<interceptor-ref name="SecondInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors> <action name="LoginAction" class="Action.LoginAction">
<interceptor-ref name="AllInterceptor"></interceptor-ref>
<result name="success">success.jsp</result>
</action>

struts2自带的拦截器:

自定义规则

struts2提供的 interceptor-stack 不是让我们偷懒的,很多时候,我定义自己很多的拦截器,每一个拦截器在不同业务场景下是不同的,我们不能为了图方便,把所以拦截器全部配置为一个拦截器栈来使用,这回极大的加强服务器的负担,

比如说:methodFirstceptor 是一个方法拦截器,我们配置需要拦截的方法,而function 拦截器又不需要拦截相关的方法,所以就没有必要把他们放在一起。

<!-- 拦截器栈配置属于自己的拦截器规则 -->
<interceptor-stack name="mystack">
<interceptor-ref name="methodFirstceptor"></interceptor-ref>
<interceptor-ref name="funtion"></interceptor-ref>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">2097152</param>
<!-- <param name="fileUpload.allowedTypes">text/html,text/xml</param> -->
<param name="fileUpload.allowedExtensions">html,dtd,xml</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>

注意:默认拦截器 也叫全局拦截器 (也就是说我们 一定要注意在配置 默认拦截器的时候 不要加过多无用的拦截器,只要那些都需要作用到每个Action上的拦截器,才能配置拦截器栈 以及默认拦截器)

   <!-- 为此包下的所有action应用拦截器 -->
<default-interceptor-ref name="permissionStack" />

普通拦截器:

 //可以实现Interceptor
public class MyInterceptor extends AbstractInterceptor { /**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception { System.out.println("before invocation.invoke..."); //可以不调用
String result = invocation.invoke(); System.out.println("after invocation.invoke..."); return "success";
}
}

方法拦截器:

 public class MethodFirstceptor extends MethodFilterInterceptor {
/**
*
*/
private static final long serialVersionUID = 1L; @Override
protected String doIntercept(ActionInvocation aInvocation) throws Exception {
System.out.println("进入方法拦截器");
String str = aInvocation.invoke();
System.out.println("退出方法拦截器");
return str;
} @Override
public Set<String> getExcludeMethodsSet() {
// TODO Auto-generated method stub
return super.getExcludeMethodsSet();
} @Override
public Set<String> getIncludeMethodsSet() {
// TODO Auto-generated method stub
return super.getIncludeMethodsSet();
}
}

struts2配置文件:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="i18n"></constant>
<constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/" extends="struts-default"> <interceptors>
<!--方法拦截器配置 -->
<interceptor name="methodFirstceptor"
class="interceptors.MethodFirstceptor">
<!--配置参数 :拦截什么方法 -->
<!--includeMethods控制能访问哪些 -->
<param name="includeMethods">add</param>
<!--excludeMethods控制能访问哪些 -->
</interceptor> <!-- 自定义拦截器 -->
<interceptor name="hello"
class="interceptors.MyInterceptor"></interceptor> <!-- 拦截器栈配置属于自己的拦截器规则 -->
<interceptor-stack name="mystack">
<interceptor-ref name="methodFirstceptor"></interceptor-ref>
<interceptor-ref name="hello"></interceptor-ref>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">2097152</param>
<!-- <param name="fileUpload.allowedTypes">text/html,text/xml</param> -->
<param name="fileUpload.allowedExtensions">html,dtd,xml</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack> </interceptors> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 执行默认的方法的时候 是不会被拦截的 -->
<action name="loginAction" class="action.LoginAction">
<interceptor-ref name="mystack"></interceptor-ref>
<result>/success.jsp</result>
</action> <!-- 执行要拦截的方法 -->
<action name="addAction" class="action.LoginAction" method="add">
<interceptor-ref name="mystack"></interceptor-ref>
<result>/success.jsp</result>
</action> <action name="testUpload" class="upload.UploadAction">
<result>/success.jsp</result>
<result name="input">/upload.jsp</result>
</action> <action name="testUpload2" class="upload.MulUploadAction">
<result>/success.jsp</result>
<result name="input">/uploadmul.jsp</result>
</action> <action name="testDownload" class="download.DownLoadAction">
<result type="stream">
<param name="bufferSize">2048</param>
<!-- <param name="contentType">${contentType}</param> -->
<!-- 调用当前action中的getContentType()方法 -->
<param name="contentDisposition">attachment;filename=${filename}</param>
<param name="inputStream">${inputStream}</param>
<!-- 调用当前action中的getInputStream()方法 -->
</result>
</action> <!-- 表单重复提交问题 --> <action name="testToken" class="token.TokenAction">
<interceptor-ref name="mystack"></interceptor-ref>
<!-- 会转到标记为invalid-token的页面 -->
<!-- <interceptor-ref name="token"></interceptor-ref> -->
<!-- 停留在当前页面,不做任何操作 -->
<interceptor-ref name="tokenSession"></interceptor-ref>
<!-- 必须调用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/success.jsp</result>
<result name="invalid.token">/token-error.jsp</result>
</action> </package> </struts>

<package name="default" extends="struts-default"><!--配置拦截器--><interceptors><interceptor name="FirstInterceptor" class="Interceptor.FirstInterceptor"><param name="value" >YEN</param></interceptor><interceptor name="SecondInterceptor" class="Interceptor.SecondInterceptor"></interceptor><interceptor-stack name="AllInterceptor"><interceptor-ref name="FirstInterceptor"></interceptor-ref><interceptor-ref name="SecondInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="LoginAction" class="Action.LoginAction"><interceptor-ref name="AllInterceptor"></interceptor-ref><result name="success">success.jsp</result></action>

Struts2拦截器再认识的更多相关文章

  1. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  2. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  3. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  4. (三)Struts2 拦截器

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:拦截器简介 (百度百科Struts2) Struts2 拦截器是在访问某 ...

  5. 从struts2拦截器到自定义拦截器

    拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...

  6. Struts2拦截器登录验证

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

  7. struts2(五)之struts2拦截器与自定义拦截器

    前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...

  8. Struts2拦截器详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列 ...

  9. Struts2拦截器的配置

    struts2拦截器interceptor的三种配置方法方法1. 普通配置法 <struts> <package name="struts2" extends=& ...

随机推荐

  1. 算法(Algorithms)第4版 练习 1.3.9

    主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...

  2. C/C++连接查询MYSQL

    1. [代码][C/C++]代码 #include <mysql/mysql.h>#include <stdio.h>#include <string.h>int ...

  3. LoadRunner中的函数

    函数是LoadRunner提供给性能测试工程师的利器,有了它,性能测试工程师可以对脚本进行更为自由的开发,更适应实际测试的需求,进一步扩展脚本的功能. LoadRunner函数的格式: 返回值  函数 ...

  4. 【MFC】动态创建CMFCToolbar图标不显示问题

    最近遇到一个问题,需要动态的从xml文件读取一系列图标文件,加载到一个toolbar中,由于使用的是vs2008 with sp1 feature pack,自然想到用CMFCToolbar来做,思路 ...

  5. bzoj2309 CTSC2011 字符串重排

    题意: 给定n个字符串S1,S2,S3,...,Sn,把它们排序 设排序结果为Sp1,Sp2,Sp3,...,Spn 现在给定q个任务,每个任务的格式都是"要求在排序结果中Sa恰好在Sb前一 ...

  6. 使用google浏览器模拟手机终端的方法

    谷歌Chrome浏览器,可以很方便地用来当移动终端模拟器.在Windows的[开始]-->[运行]中输入以下命令,启动谷歌浏览器,即可模拟相应手机的浏览器去访问3G手机网页,前提:将先前开启的谷 ...

  7. MySQL条件判断处理函数_20160925

    MySQL条件判断处理 一.假如我想把salesperson 分成 5组,计算每个销售分组的业绩 首先先将销售分组 SELECT *, CASE WHEN salesperson IN (" ...

  8. pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时,遇到一个报错: RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is ...

  9. MySQL锁之一:锁详解

    一.    什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...

  10. lwip 移植

    一.源码目录结构 api . core.netif. include core下又有IPV4 . IPV6 . SNMP 和.c文件 include下又有IPV4.IPV6.LWIP.netif ne ...