- 浏览: 406010 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
junchao_qin:
[img][flash=200,200][url][img]引 ...
MyEclipse中使用VSS插件 -
tigerwood008:
IE11不好用!!
js弹出窗口 + 获取上传文件全路径 -
TheMatrix:
$.ajaxSetup({async : false});这种 ...
jquery 中的post和get方法如何同步 -
多多成长记:
Blazeds与java通信 -
ZED.CWT:
[align=ceiinter][/align]
java中利用JFrame创建窗体 【转】
转自http://blog.csdn.net/qjyong/article/details/1824607
Struts2 拦截器 (Interceptor)
++YONG 原创,转载请注明
1. 理解拦截器
1.1. 什么是拦截器:
拦截器,在 AOP ( Aspect-Oriented Programming )中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是 AOP 的一种实现策略。
在 Webwork 的中文文档的解释为——拦截器是动态拦截 Action 调用的对象。它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行。同时也是提供了一种可以提取 action 中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链( Interceptor Chain ,在 Struts 2 中称为拦截器栈 Interceptor Stack )。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
1.2. 拦截器的实现原理:
大部分时候,拦截器方法都是通过代理的方式来调用的。 Struts 2 的拦截器实现相对简单。当请求到达 Struts 2 的 ServletDispatcher 时, Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表( list ),最后一个一个地调用列表中的拦截器。如下图:
2. 拦截器的配置
Struts 2 已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以至 struts2 的 jar 包内的 struts-default.xml 查看关于默认的拦截器与拦截器链的配置。
Struts2 ( XWork )提供的拦截器的功能说明:
拦截器 |
名字 |
说明 |
Alias Interceptor |
alias |
在不同请求之间将请求参数在不同名字件转换,请求内容不变 |
Chaining Interceptor |
chain |
让前一个 Action 的属性可以被后一个 Action 访问,现在和 chain 类型的 result ( <result type=”chain”> )结合使用。 |
Checkbox Interceptor |
checkbox |
添加了 checkbox 自动处理代码,将没有选中的 checkbox 的内容设定为 false ,而 html 默认情况下不提交没有选中的 checkbox 。 |
Cookies Interceptor |
cookies |
使用配置的 name,value 来是指 cookies |
Conversion Error Interceptor |
conversionError |
将错误从 ActionContext 中添加到 Action 的属性字段中。 |
Create Session Interceptor |
createSession |
自动的创建 HttpSession ,用来为需要使用到 HttpSession 的拦截器服务。 |
Debugging Interceptor |
debugging |
提供不同的调试用的页面来展现内部的数据状况。 |
Execute and Wait Interceptor |
execAndWait |
在后台执行 Action ,同时将用户带到一个中间的等待页面。 |
Exception Interceptor |
exception |
将异常定位到一个画面 |
File Upload Interceptor |
fileUpload |
提供文件上传功能 |
I18n Interceptor |
i18n |
记录用户选择的 locale |
Logger Interceptor |
logger |
输出 Action 的名字 |
Message Store Interceptor |
store |
存储或者访问实现 ValidationAware 接口的 Action 类出现的消息,错误,字段错误等。 |
Model Driven Interceptor |
model-driven |
如果一个类实现了 ModelDriven ,将 getModel 得到的结果放在 Value Stack 中。 |
Scoped Model Driven |
scoped-model-driven |
如果一个 Action 实现了 ScopedModelDriven ,则这个拦截器会从相应的 Scope 中取出 model 调用 Action 的 setModel 方法将其放入 Action 内部。 |
Parameters Interceptor |
params |
将请求中的参数设置到 Action 中去。 |
Prepare Interceptor |
prepare |
如果 Acton 实现了 Preparable ,则该拦截器调用 Action 类的 prepare 方法。 |
Scope Interceptor |
scope |
将 Action 状态存入 session 和 application 的简单方法。 |
Servlet Config Interceptor |
servletConfig |
提供访问 HttpServletRequest 和 HttpServletResponse 的方法,以 Map 的方式访问。 |
Static Parameters Interceptor |
staticParams |
从 struts.xml 文件中将 <action> 中的 <param> 中的内容设置到对应的 Action 中。 |
Roles Interceptor |
roles |
确定用户是否具有 JAAS 指定的 Role ,否则不予执行。 |
Timer Interceptor |
timer |
输出 Action 执行的时间 |
Token Interceptor |
token |
通过 Token 来避免双击 |
Token Session Interceptor |
tokenSession |
和 Token Interceptor 一样,不过双击的时候把请求的数据存储在 Session 中 |
Validation Interceptor |
validation |
使用 action-validation.xml 文件中定义的内容校验提交的数据。 |
Workflow Interceptor |
workflow |
调用 Action 的 validate 方法,一旦有错误返回,重新定位到 INPUT 画面 |
Parameter Filter Interceptor |
N/A |
从参数列表中删除不必要的参数 |
Profiling Interceptor |
profiling |
通过参数激活 profile |
在 struts.xml 文件中定义拦截器,拦截器栈:
< package name = "my" extends = "struts-default" namespace = "/manage" > < interceptors > <!-- 定义拦截器 --> < interceptor name = " 拦截器名 " class = " 拦截器实现类 " /> <!-- 定义拦截器栈 --> < interceptor-stack name = " 拦截器栈名 " > < interceptor-ref name = " 拦截器一 " /> < interceptor-ref name = " 拦截器二 " /> </ interceptor-stack > </ interceptors > ...... </package> |
3. 使用拦截器
一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截 Action 了。拦截器的拦截行为将会在 Action 的 exceute 方法执行之前被执行。
< action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" > < result name = "success" > /success.jsp </ result > < result name = "error" > /error.jsp </ result > <!-- 使用拦截器 , 一般配置在 result 之后, --> <!-- 引用系统默认的拦截器 --> < interceptor-ref name = "defaultStack" /> < interceptor-ref name = " 拦截器名或拦截器栈名 " /> </ action > |
此处需要注意的是,如果为 Action 指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。
4. 自定义拦截器
作为“框架( framework )”,可扩展性是不可或缺的。虽然, Struts 2 为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在 Struts 2 自定义拦截器是相当容易的一件事。
4.1. 实现拦截器类:
所有的 Struts 2 的拦截器都直接或间接实现接口 com.opensymphony.xwork2.interceptor.Interceptor 。该接口提供了三个方法:
1) void init(); 在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。
2) void destroy(); 该方法跟 init() 方法对应。在拦截器实例被销毁之前,系统将回调该方法。
3) String intercept(ActionInvocation invocation) throws Exception; 该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。
除此之外,继承类 com.opensymphony.xwork2.interceptor.AbstractInterceptor 是更简单的一种实现拦截器类的方式,因为此类提供了 init() 和 destroy() 方法的空实现,这样我们只需要实现 intercept 方法。
4.2. 使用自定义拦截器:
两个步骤:
l 通过 <interceptor …> 元素来定义拦截器。
l 通过 <interceptor-ref …> 元素来使用拦截器。
5. 自定义拦截器示例
5.1. 问题描述:
使用自定义拦截器来完成用户权限的控制:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。
5.2. 实现权限控制拦截器类:
AuthorizationInterceptor.java
package org.qiujy.common;
import java.util.Map;
import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/** * 权限检查拦截器 * * @author qiujy * @version 1.0 */ public class AuthorizationInterceptor extends AbstractInterceptor {
/* * 拦截 Action 处理的拦截方法 * */ public String intercept(ActionInvocation invocation) throws Exception {
Map session = invocation.getInvocationContext().getSession(); String userName = (String) session.get( "userName" );
if ( null != userName && userName.equals( "test" )) { System. out .println( " 拦截器:合法用户登录 ---" ); return invocation.invoke(); } else { System. out .println( " 拦截器:用户未登录 ---" ); return Action. LOGIN ; } } } |
5.3. 配置权限控制拦截器:
struts.xml :
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > < struts > < package name = "my" extends = "struts-default" >
< interceptors > <!-- 定义权限控制拦截器 --> < interceptor name = "authority" class = "org.qiujy.common.AuthorizationInterceptor" /> </ interceptors >
<!-- 定义全局处理结果 --> < global-results > <!-- 逻辑名为 login 的结果,映射到 /login.jsp 页面 --> < result name = "login" > /login.jsp </ result > </ global-results >
< action name = "listall" class = "org.qiujy.web.struts2.action.UserAction" method = "listAllUser" > < result name = "success" > /listall.jsp </ result > <!-- 使用拦截器 --> < interceptor-ref name = "defaultStack" /> < interceptor-ref name = "authority" /> </ action >
< action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" > < result name = "success" > /success.jsp </ result > </ action > </ package > </ struts > |
其它页面见源代码。
5.4. 运行调试:
在浏览器地址栏直接输入 http://localhost:8080/AuthorityInterceptorDemo/listall.action 来访问,此动作配置了权限拦截器,所有被转到登录页面。
登录后:
再访问 http://localhost:8080/AuthorityInterceptorDemo/listall.action 这个链接:
如果为了简化 struts.xml 文件的配置,避免在每个 Action 重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈。如下:
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > < struts > < package name = "my" extends = "struts-default" >
< interceptors > <!-- 定义权限控制拦截器 --> < interceptor name = "authority" class = "org.qiujy.common.AuthorizationInterceptor" /> <!-- 定义一个包含权限控制的拦截器栈 --> < interceptor-stack name = "mydefault" > < interceptor-ref name = "defaultStack" /> < interceptor-ref name = "authority" /> </ interceptor-stack > </ interceptors >
<!-- 定义默认拦截器 --> < default-interceptor-ref name = "mydefault" />
<!-- 定义全局处理结果 --> < global-results > <!-- 逻辑名为 login 的结果,映射到 /login.jsp 页面 --> < result name = "login" > /login.jsp </ result > </ global-results >
< action name = "listall" class = "org.qiujy.web.struts2.action.UserAction" method = "listAllUser" > < result name = "success" > /listall.jsp </ result > </ action > </ package >
< package name = "font" extends = "struts-default" > < action name = "userOpt" class = "org.qiujy.web.struts2.action.UserAction" > < result name = "success" > /success.jsp </ result > </ action > </ package > </ struts > |
一旦在某个包下定义了默认拦截器栈,在该包下的所有 action 都会使用此拦截器栈。对于那些不想使用些拦截器栈的 action ,则应该将它放置在其它的包下。
发表评论
-
判断二叉树是否平衡及计算二叉树深度和结点个数
2012-09-01 10:12 7727参考:http://blog.csdn.net/zz19880 ... -
【转】java实现二叉查找树
2012-08-31 09:44 1544转自:http://blog.csdn.net/zyj817 ... -
二叉树及其遍历
2012-08-21 09:50 1564转自:http://www.iteye.com/t ... -
java栈中缀表达式转为后缀表达式
2012-07-19 11:33 2470思路: 遇到数字,则输出。 遇到操作符,入栈,在入栈前若该 ... -
java栈实现括号匹配
2012-07-19 09:48 4542算法思想: 做一个空栈,读入字符。 若字符是左运算符,则入 ... -
【转】java静态变量和实例变量的区别
2012-06-20 11:02 1342转自:http://www.2cto.com/kf/20100 ... -
【转】java中会存在内存泄漏吗,请简单描述。
2012-06-20 10:24 1389java中 ... -
【转】java匿名内部类2
2012-06-12 13:45 1267匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类? ... -
【转】java匿名内部类
2012-06-12 13:32 1446java匿名内部类 (2010-11 ... -
【转】JAVA中获取路径
2012-03-25 16:57 859转自:http://wenku.baidu.com/view/ ... -
【转】Map遍历
2012-03-25 16:56 944转自:http://wenku.baidu.com/view/ ... -
【转】java解析xml文件四种方式
2012-03-25 16:54 1403转自:http://wenku.baidu.com ... -
【转】JDOM解析处理xml
2012-03-25 16:52 1263转自http://qingbyqing.iteye.com/b ... -
【转】解析Html页面:HTML Parser的试用
2012-03-24 15:10 1420转自:http://blog.csdn.net/scud/ar ... -
【转】java随机排列数组
2012-02-20 18:58 2373转自:http://blog.csdn.net/liang ... -
设计模式——代理模式
2012-01-06 13:14 1271代理模式: 为其他对象提供一种代理以控制对这个对象的访问 ... -
设计模式——装饰模式
2012-01-05 15:58 1282首先介绍三个重要原则: 依赖倒转原则:高层模块不应该依赖于 ... -
设计模式——策略模式 & 单例模式
2011-12-29 16:26 1574策略模式: * 策略模式定义了算法家族,分别封装起来,让他 ... -
排序算法
2011-12-28 22:41 961参考:http://student.zjzk.cn/cours ... -
设计模式——简单工厂 VS 工厂方法
2011-12-28 15:07 1210简单工厂模式: 它最大优点在于工厂类中包含了必要的逻辑 ...
相关推荐
在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...
标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...
### Struts2拦截器的使用方法 #### 一、Struts2拦截器概述 Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活...
当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...
拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...
拦截器是Struts2框架的核心组件之一,它允许开发者在动作执行前后插入自定义逻辑,实现如权限验证、日志记录、性能优化等多种功能。在"Struts2 拦截器注解"这个主题中,我们将深入探讨如何利用注解来简化拦截器的...
这篇博客“Struts2 拦截器的执行顺序(二十九)”可能探讨了Struts2拦截器链的工作原理和它们的执行顺序,这对于理解Struts2的内部机制至关重要。 首先,让我们深入理解Struts2的拦截器。拦截器是在Action调用前后...
这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...
### Struts2 拦截器与验证框架详解 #### 一、Struts2概述 Struts2是一个基于Java的企业级Web应用开发框架,它继承了Struts1的优点,并在此基础上进行了很多改进,使得开发更加灵活高效。Struts2的核心是拦截器...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...