拦截器(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. VLAN(虚拟局域网)划分

    VLAN根据不同的需求,可以有多种划分方式: 一:静态划分 基于端口             按VLAN交换机上的物理端口和内部的PVC(永久虚电路)端口来划分 静态划分安全.可靠,易于配置与维护 二 ...

  2. POJ 2096 Collecting Bugs:期望dp

    题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...

  3. Linux_异常_01_CentOS7无法ping 百度

    一.原因 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no B ...

  4. Queue Explorer过期处理

    Queue Explorer是收费软件,用一段时间后会显示过期界面无法使用, 我们可以删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Cogin\Queue ...

  5. SSH中的Hibernate

    SSH中的Hibernate 就是DAO连接数据库对数据进行实际操作,做了架构简化,对数据库的操作.

  6. linux 进程学习笔记-暂停进程

    <!--[if !supportLists]-->Ÿ <!--[endif]-->暂停进程 int pause() 其会挂起当前进程直到有信号来唤醒或者进程被结束. 随便提一下 ...

  7. Visual Studio 2012简体中文专业版密钥(激活码)

    VS2012 正式版在Beta版的基础上进行了很多改进,尤其是加入了全新的用户界面. VS2012 的硬件需求与VS2010相同,不过由于 Visual Studio 2012 利用了新版 Windo ...

  8. MySQL_杭州11月1-29号在线产品在线天数、销售天数_20161129

    杭州11月1-29号在线产品在线天数.销售天数 1.产品在这个时间段内的每一天的在线情况,然后聚合计算每个产品的在线天数,每一天的在线情况 如果在线记为1,不在线为null 2.计算每个产品在这个时间 ...

  9. 编写html页面时常见的问题(一)

    说到写页面,肯定有很多人在刚接触编写页面这一块时遇到很多细节和兼容性的问题,那么在这里我总结一些经常遇到的小问题.希望能够帮助学习页面搭建的初学者! 虽然说ie6很多公司都已经抛弃,但是个人认为,初学 ...

  10. BZOJ_5338_ [TJOI2018]xor_可持久化trie

    BZOJ_5338_ [TJOI2018]xor_可持久化trie Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...