拦截器(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. React之jsx语法特性

    jsx 语法,直接可以在js中使用html标签. 还可以通过花括号的形式,在html标签中,写js表达式. <div> { 1 + 2 } hello,world! </div> ...

  2. Linux学习之路(三)搜索命令

    1.文件搜索命令locate 2.命令搜索命令whereis与which 3.字符串搜索命令grep 4.find命令与grep命令的区别 locate命令相对于find命令搜索非常快,find命令在 ...

  3. 在ubuntu环境安装youcompleteme

    sudo apt-get update #更新软件源 sudo apt-get clang #安装clang sudo apt-get cmake #安装cmake sudo apt-get inst ...

  4. xgboost算法原理

    XGBoost是2014年3月陈天奇博士提出的,是基于CART树的一种boosting算法,XGBoost使用CART树有两点原因:对于分类问题,CART树的叶子结点对应的值是一个实际的分数,而非一个 ...

  5. HDU4348:To the moon

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227. ...

  6. hdu 3625 Examining the Rooms —— 第一类斯特林数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 学习斯特林数:https://blog.csdn.net/qq_33229466/article/d ...

  7. VijosP1443:银河英雄传说

    描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集 ...

  8. PCB上的导线 怎么开窗 去掉绿油 把铜皮裸露

    开窗是个专业术语,你可以简单的理解为"去掉绿油,把铜皮裸露". 导线开窗用途一: 例如这个板子中的蛇形天线,就是导线开窗后的效果. 导线开窗用途二: 把需要过大电流的导线开窗,就可 ...

  9. MangoDB篇章(1)

    关系型数据库遵循ACID规则 事务(transaction)4个特性:原子性(A).一致性(C).独立性(I).持久性(D) : 分布式系统(distributed system): 由多台计算机和通 ...

  10. JavaScript高级程序设计学习笔记第二章

    1.向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素 2.HTML 4.01中定义了<script>元素的六个属性(方便记忆,可将6个属 ...