一、拦截器简介

Struts拦截器和Action的关系如图:

为了在使用拦截器时制定参数值,应通过<interceptor-ref …/>元素添加<param …/>子元素来为拦截器指定参数值。下面是配置拦截器动态指定参数值的语法。

  1: <interceptor-stack name="拦截器栈一">
  2:     <interceptor-ref name="拦截器一">
  3:         <param name="参数一">参数值一</param>
  4:         <param name="参数二">参数值二</param>
  5:     </interceptor-ref>
  6: </interceptor-stack>

二、自定义拦截器

1、简单的拦截器

用户要开发自己的拦截器,需要实现com.opensymphony.xwork2.interceptor.Interceptor接口。下面实现了一个简单的拦截器

1、SimpleInterceptor.java

  1: package cc.openhome;
  2: import java.util.Date;
  3: import com.opensymphony.xwork2.ActionInvocation;
  4: import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  5: public class SimpleInterceptor extends AbstractInterceptor {
  6:   //简单的拦截器的名字
  7:   private String name;
  8:   //为该简单拦截器设置名字的setter方法
  9:   //拦截Action方法的intercept方法
 10:   @Override
 11:   public String intercept(ActionInvocation invocation) throws Exception {
 12:     // TODO Auto-generated method stub
 13:     //取得被拦截的Action实例
 14:     LoginAction action = (LoginAction) invocation.getAction();
 15:     //打印
 16:     System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"开始执行登录的时间为:"+new Date());
 17:     //取得开始执行Action的时间
 18:     long start = System.currentTimeMillis();
 19:     //执行该拦截器的后一个拦截器,或者直接指定Action的execute()方法
 20:     String result = invocation.invoke();
 21:     System.out.println("正在执行 ‘"+name+" ’拦截器的动作========"+"执行完登录的时间为:"+new Date());
 22:     //取得执行完Action的时间
 23:     long end = System.currentTimeMillis();
 24:     System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"Action执行了"+(end-start)+"毫秒");
 25:     return result;
 26:   }
 27:   public String getName() {
 28:     return name;
 29:   }
 30:
 31:   public void setName(String name) {
 32:     this.name = name;
 33:   }
 34: }
 35: 

2、struts.xml

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: <!DOCTYPE struts PUBLIC
  3:   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4:   "http://struts.apache.org/dtds/struts-2.3.dtd">
  5: <struts>
  6:   <package name="struts2" extends="struts-default">
  7:     <!-- 配置应用所使用的拦截器 -->
  8:         <interceptors>
  9:           <!-- 配置mysimple拦截器 -->
 10:           <interceptor name="mysimple" class="cc.openhome.SimpleInterceptor">
 11:             <!-- 为该拦截器指定参数值 -->
 12:             <param name="name">简单拦截器</param>
 13:           </interceptor>
 14:           <interceptor name="authority" class="cc.openhome.AuthorityInterceptor"/>
 15:         </interceptors>
 16:         <action name="login" class="cc.openhome.LoginAction">
 17:           <result name="success">/success.jsp</result>
 18:           <result name="error">/error.jsp</result>
 19:           <result name="input">/denglu.jsp</result>
 20:           <interceptor-ref name="defaultStack"/>
 21:           <interceptor-ref name="mySimple">
 22:               <param name="name">动态拦截器</param>
 23:           </interceptor-ref>
 24:         </action>
 25:     </package>
 26: </struts>

3、登录页面login.jsp

  1: <%@ page language="java" contentType="text/html; charset=UTF-8"
  2:     pageEncoding="UTF-8"%>
  3: <%@ taglib prefix="s" uri="/struts-tags"%>
  4: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5: <html>
  6:   <head>
  7:     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8:     <title>登录界面</title>
  9:   </head>
 10:   <body>
 11:     <s:form action="login">
 12:       <s:textfield name="username" label="用户名"/>
 13:       <s:textfield name="password" label="密    码"/>
 14:       <s:submit value="登录"/>
 15:     </s:form>
 16:   </body>
 17: </html>

4、LoginAction.java

  1: package cc.openhome;
  2: import com.opensymphony.xwork2.Action;
  3: import com.opensymphony.xwork2.ModelDriven;
  4: public class LoginAction  implements Action{
  5:   private String username;
  6:   private String password;
  7:   public String getUsername() {
  8:     return username;
  9:   }
 10:   public void setUsername(String username) {
 11:     this.username = username;
 12:   }
 13:   public String getPassword() {
 14:     return password;
 15:   }
 16:   public void setPassword(String password) {
 17:     this.password = password;
 18:   }
 19:   @Override
 20:   public String execute() throws Exception {
 21:     // TODO Auto-generated method stub
 22:     return SUCCESS;
 23:   }
 24: }
 25: 

5、运行结果

2、拦截器的执行顺序

修改struts.xml如下

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: <!DOCTYPE struts PUBLIC
  3:   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4:   "http://struts.apache.org/dtds/struts-2.3.dtd">
  5: <struts>
  6:   <constant name="struts.custom.i18n.resources" value="messageResource"></constant>
  7:   <package name="openhome" extends="struts-default">
  8:     <!-- 配置应用所使用的拦截器 -->
  9:         <interceptors>
 10:           <!-- 配置mysimple拦截器 -->
 11:           <interceptor name="mysimple" class="cc.openhome.SimpleInterceptor">
 12:             <!-- 为该拦截器指定参数值 -->
 13:             <param name="name">简单拦截器</param>
 14:           </interceptor>
 15:         </interceptors>
 16:     <action name="login" class="cc.openhome.LoginAction" method="execute">
 17:       <result name="input">/input.jsp</result>
 18:       <result name="success">/WEB-INF/page/welcome.jsp</result>
 19:       <result name="error">/WEB-INF/page/error.jsp</result>
 20:       <interceptor-ref name="defaultStack" />
 21:       <interceptor-ref name="mysimple">
 22:         <param name="name">第一个动态拦截器</param>
 23:       </interceptor-ref>
 24:       <interceptor-ref name="mysimple">
 25:         <param name="name">第二个动态拦截器</param>
 26:       </interceptor-ref>
 27:     </action>
 28:   </package>
 29:     <!-- Add packages here -->
 30: </struts>
 31:   

运行结果如下:可以看到先配置的拦截器,先获得执行机会。

3、方法拦截器

如果不需要拦截特定的方法,假如不拦截execute方法,则在控制台上就不会输出任何信息。

只需要修改提供方法过滤的拦截器

MyFilterInterceptor.java

  1: package cc.openhome;
  2: import java.util.Date;
  3: import com.opensymphony.xwork2.ActionInvocation;
  4: import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
  5: public class MyFilterInterceptor extends MethodFilterInterceptor {
  6:   private String name;
  7:   public String getName() {
  8:     return name;
  9:   }
 10:   public void setName(String name) {
 11:     this.name = name;
 12:   }
 13:   @Override
 14:   protected String doIntercept(ActionInvocation invocation) throws Exception {
 15:     // TODO Auto-generated method stub
 16:     //取得被拦截的Action实例
 17:         LoginAction action = (LoginAction) invocation.getAction();
 18:
 19:         //打印
 20:         System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"开始执行登录的时间为:"+new Date());
 21:
 22:         //取得开始执行Action的时间
 23:         long start = System.currentTimeMillis();
 24:
 25:         //执行该拦截器的后一个拦截器,或者直接指定Action的execute()方法
 26:         String result = invocation.invoke();
 27:         System.out.println("正在执行 ‘"+name+" ’拦截器的动作========"+"执行完登录的时间为:"+new Date());
 28:
 29:         //取得执行完Action的时间
 30:         long end = System.currentTimeMillis();
 31:         System.out.println("正在执行 ‘"+name+"’ 拦截器的动作========"+"Action执行了"+(end-start)+"毫秒");
 32:         return result;
 33:   }
 34: }
 35: 

struts.xml

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: <!DOCTYPE struts PUBLIC
  3:   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4:   "http://struts.apache.org/dtds/struts-2.3.dtd">
  5: <struts>
  6:   <package name="openhome" extends="struts-default">
  7:     <!-- 配置应用所使用的拦截器 -->
  8:         <interceptors>
  9:           <!-- 配置myfilter拦截器 -->
 10:           <interceptor name="myfilter" class="cc.openhome.MyFilterInterceptor">
 11:             <!-- 为该拦截器指定参数值 -->
 12:             <param name="name">方法过滤拦截器</param>
 13:           </interceptor>
 14:           </interceptor>
 15:           <interceptor name="authority" class="cc.openhome.AuthorityInterceptor"/>
 16:         </interceptors>
 17:     <action name="login" class="cc.openhome.LoginAction" method="execute">
 18:       <result name="input">/input.jsp</result>
 19:       <result name="success">/WEB-INF/page/welcome.jsp</result>
 20:       <result name="error">/WEB-INF/page/error.jsp</result>
 21:       <interceptor-ref name="defaultStack" />
 22:       <interceptor-ref name="myfilter">
 23:         <param name="name">改名后的方法拦截器</param>
 24:         <param name="excludeMethods">execute</param>
 25:       </interceptor-ref>
 26:     </action>
 27:   </package>
 28:     <!-- Add packages here -->
 29: </struts>
 30:   

3、拦截结果的监听器

为了更精确的定义在execute方法执行前后的结构,以及执行后再处理Result执行的动作。这个监听器通过手动注册在拦截内部,必须实现PreReslutListener接口。

MyPreResultListener.java

  1: package cc.openhome;
  2: import com.opensymphony.xwork2.ActionInvocation;
  3: import com.opensymphony.xwork2.interceptor.PreResultListener;
  4: public class MyPreResultListener implements PreResultListener {
  5:   @Override
  6:   public void beforeResult(ActionInvocation invocation, String resultCode) {
  7:     // TODO Auto-generated method stub
  8:     System.out.println("返回的逻辑视图是:"+resultCode);
  9:   }
 10: }
 11: 

    BeforeResultInterceptor.java

  1: package cc.openhome;
  2: import com.opensymphony.xwork2.ActionInvocation;
  3: import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  4: public class BeforeResultInterceptor extends AbstractInterceptor {
  5:   @Override
  6:   public String intercept(ActionInvocation invocation) throws Exception {
  7:     // TODO Auto-generated method stub
  8:     //将一个拦截器结果的监听器注册给该拦截器
  9:     invocation.addPreResultListener(new MyPreResultListener());
 10:     System.out.println("execute方法执行之前的拦截。。。");
 11:     //调用下一个拦截器,或者Action的执行方法execute()
 12:     String result = invocation.invoke();
 13:     System.out.println("execute方法执行之后的拦截。。。");
 14:     return result;
 15:   }
 16: }
 17: 

    struts.xml

  1: <?xml version="1.0" encoding="UTF-8" ?>
  2: <!DOCTYPE struts PUBLIC
  3:   "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4:   "http://struts.apache.org/dtds/struts-2.3.dtd">
  5: <struts>
  6:   <constant name="struts.custom.i18n.resources" value="messageResource"></constant>
  7:   <package name="openhome" extends="struts-default">
  8:     <!-- 配置应用所使用的拦截器 -->
  9:         <interceptors>
 10:           <!-- 配置myresult拦截器 -->
 11:           <interceptor name="myresult" class="cc.openhome.BeforeResultInterceptor">
 12:             <!-- 为该拦截器指定参数值 -->
 13:             <param name="name">结果的拦截器</param>
 14:           </interceptor>
 15:         </interceptors>
 16:     <action name="login" class="cc.openhome.LoginAction" method="execute">
 17:       <result name="input">/input.jsp</result>
 18:       <result name="success">/WEB-INF/page/welcome.jsp</result>
 19:       <result name="error">/WEB-INF/page/error.jsp</result>
 20:       <interceptor-ref name="defaultStack" />
 21:       <interceptor-ref name="myresult">
 22:         <param name="name">结果拦截器</param>
 23:       </interceptor-ref>
 24:     </action>
 25:     <!-- Add packages here -->
 26: </struts>
 27:   

    运行结果

Struts2拦截器介绍的更多相关文章

  1. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  2. Struts2拦截器配置实例

    拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...

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

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

  4. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  5. 防止未登录用户操作—struts2拦截器简单实现(转)

    原文地址:http://blog.csdn.net/zhutulang/article/details/38351629 尊重原创,请访问原地址 一般,我们的web应用都是只有在用户登录之后才允许操作 ...

  6. struts2 拦截器

    拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...

  7. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  8. struts2拦截器

    一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...

  9. Struts2拦截器模拟

    前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...

随机推荐

  1. 实现免密码输入 ssh 登录

    实现免密码输入 ssh 登录假设 A 为客户机器, B 为目标机:要达到的目的:A 机器 ssh 登录 B 机器无需输入密码:加密方式选 rsa|dsa 均可以,默认 dsa做法:1.登录 A 机器2 ...

  2. CodeForces 591B Rebranding

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<vector> #incl ...

  3. Qt5:窗口背景色的设置

    在Qt中,设置窗口背景色有多种方法,如通过setStyleSheet   和 调色板 setPalette 等 下面是setPalette 方法 QPalette pale = palette(); ...

  4. Android提高第十二篇之蓝牙传感应用

        请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...

  5. 编译内核启用iptables及netfilter

    在Network Packet Filtering Framework(Netfilter)一节中还有两个额外的配置节——Core Netfilter Configuration(核心Netfilte ...

  6. iOS开发之隐藏tabbar--解决隐藏后依然不能响应对应位置事件的问题

    状态条StatusBar 1 [UIApplication sharedApplication].statusBarHidden = YES; 导航条NavigationBar 1 [self.nav ...

  7. linux 驱动入门5

    慢慢的开始转驱动,目前比较有时间,一定要把驱动学会.哎.人生慢慢路,一回头.已经工作了八九年了.努力.在买套房.改退休了.学驱动.个人认为首先要熟悉驱动框架.慢慢来.心急吃不了热豆腐. 看网上都说的设 ...

  8. php中使用mysql_fetch_array输出数组至页面中展示

    用的是CI框架,很好的MVC结构 在Model层 public function showProteinCategory(){ $sql = "SELECT DISTINCT protein ...

  9. 8、手把手教你Extjs5(八)自定义菜单2

    这一节来定义另外三种类型的菜单类.首先定义菜单按钮类.文件放于app/view/main/region目录下面,文件名为ButtonMainMenu.js. /** * 显示在顶部的按钮菜单,可以切换 ...

  10. laravel安装excel功能

    原文安装链接:https://github.com/Maatwebsite/Laravel-Excel 代码如下: if ($rows = DB::connection('glist')->ta ...