- 浏览: 137734 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
酱油男js:
不错...学习了。
oracle sql 优化大全 -
浪子秋水:
网页编码就是那点事 -
shenghuorulan:
通俗易懂。好文章,直接想到的问题都提到了。
oracle 全文检索实践 -
飞儿9530:
lucene 3.0.1 学习
来源地址:http://www.blogjava.net/nokiaguy/archive/2008/05/09/199587.html
在上一篇中介绍了 Struts2拦截器的原理,在这一篇中我们将学习一下如何编写自己的拦截器。
一、拦截器的实现
实现一个拦截器非常简单。实际上,一个拦截器就是一个普通的类,只是这个类必须实现
com.opensymphony.xwork2.interceptor.Interceptor
接口。
Interceptor
接口有如下三个方法:
{
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
其中 init和 destroy方法只在拦截器加载和释放(都由 Struts2自身处理)时执行一次。而 intercept方法在每次访问动作时都会被调用。 Struts2在调用拦截器时,每个拦截器类只有一个对象实例,而所有引用这个拦截器的动作都共享这一个拦截器类的对象实例,因此,在实现 Interceptor接口的类中如果使用类变量,要注意同步问题。
下面我们来实现一个简单的拦截器,这个拦截器通过请求参数 action指定一个拦截器类中的方法,并调用这个方法(我们可以使用这个拦截器对某一特定的动作进行预处理)。如果方法不存在,或是 action参数不存在,则继续执行下面的代码。如下面的 URL:
http://localhost:8080/struts2/test/interceptor.action?action=test
访问上面的 url后,拦截器会就会调用拦截器中的 test方法,如果这个方法不存在,则调用 invocation.invoke方法, invoke方法和 Servlet过滤器中调用 FilterChain.doFilter方法类似,如果在当前拦截器后面还有其他的拦截器,则 invoke方法就是调用后面拦截器的 intercept方法,否则, invoke会调用 Action类的 execute方法(或其他的执行方法)。
下面我们先来实现一个拦截器的父类
ActionInterceptor。这个类主要实现了根据
action参数值来调用方法的功能,代码如下:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import javax.servlet.http. * ;
import org.apache.struts2. * ;
public class ActionInterceptor implements Interceptor
{
protected final String INVOKE = " ##invoke " ;
public void destroy()
{
System.out.println( " destroy " );
}
public void init()
{
System.out.println( " init " );
}
public String intercept(ActionInvocation invocation) throws Exception
{
HttpServletRequest request = ServletActionContext.getRequest();
String action = request.getParameter( " action " );
System.out.println( this .hashCode());
if (action != null )
{
try
{
java.lang.reflect.Method method = this .getClass().getMethod(action);
String result = (String)method.invoke( this );
if (result != null )
{
if ( ! result.equals(INVOKE))
return result;
}
else
return null ;
}
catch (Exception e)
{
}
}
return invocation.invoke();
}
}
从上面代码中的 intercept方法可以看出,在调用 action所指定的方法后,来判断返回值。可能发生的情况有三种:
1. 返回值为 null,执行 return null。
2. 返回值为 INVOKE,执行 return invockation.invoke() 。
3. 其他情况,执行 return result。 result表示指定方法的返回值,如上面代码所示。
在实现完上面的拦截器父类后,任何继承于
ActionInterceptor类的拦截器都可以自动根据
action
的参数值调用自身的相应方法。下面我们来实现一个拥有两个动作方法
test
和
print
的拦截器类。代码如下:
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
public class MultiMethodInterceptor extends ActionInterceptor
{
public String test() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().println( " invoke test " );
return this .INVOKE;
}
public String print() throws Exception
{
HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().println( " invoke print " );
return null ;
}
}
test方法返回了
INVOKE,因此,在执行完这个方法后,
Struts2会接着调用其他拦截器的
intercept方法或
Action类的
execute方法。而
print方法在执行完后,只是返回了
null,而不再调用其他的方法了,也就是访问如下的
url时,动作的
execute方法将不会执行:
http://localhost:8080/struts2/test/ddd.action?action=print
下面我们来实现一个
Action
类,代码如下:
import org.apache.struts2. * ;
import com.opensymphony.xwork2.ActionSupport;
public class InterceptorAction extends ActionSupport
{
public String abcd() throws Exception
{
ServletActionContext.getResponse().getWriter()
.println( " invoke abcd " );
return null ;
}
}
在这个 Action类中,只有一个 abcd方法,实际上,这个方法相当于 execute方法,在下面会设置动作的 method属性为 abcd。下面我们来在 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 ="demo" extends ="struts-default" namespace ="/test" >
< interceptors >
< interceptor name ="method" class ="interceptor.MultiMethodInterceptor" />
< interceptor-stack name ="methodStack" >
< interceptor-ref name ="method" />
< interceptor-ref name ="defaultStack" />
</ interceptor-stack >
</ interceptors >
< action name ="interceptor" class ="action.InterceptorAction" method ="abcd" >
< interceptor-ref name ="methodStack" />
</ action >
</ package >
</ struts >
在配置上面的 methodStack拦截器时要注意,最好在后面引用 defaultStack,否则很多通过拦截器提供的功能将失去。
OK,现在访问如下的
URL:
http://localhost:8080/struts2/test/ddd.action?action=test
在浏览器中将会出现如下的字符串:
invoke test
invoke abcd
而如果访问
http://localhost:8080/struts2/test/ddd.action?action=print,将会只出现如下的字符串:
invoke print
大家可以看出,访问这个 url时并没有调用 abcd方法。如果随便指定的 action值的话,则只调用 abcd方法,如访问 http://localhost:8080/struts2/test/ddd.action?action=aaa,就只会输出 invoke abcd。
二、拦截器的参数
我们在使用很多
Struts2内置的拦截器时会发现有很多拦截器都带参数,当然。我们自己做的拦截器也可以加上同样的参数。有两个参数比较常用,这两个参数是
includeMethods和
excludeMethods,其中
includeMethods指定了拦截器要调用的
Action类的执行方法(默认是
execute),也就是说,只有在
includeMethods中指定的方法才会被
Struts2调用,而
excludeMethods恰恰相反,在这个参数中指定的执行方法不会被
Struts2调用。如果有多个方法,中间用逗号
(,)分隔。在
Struts2中提供了一个抽象类来处理这两个参数。这个类如下:
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor
如有继承于这个类的拦截器类都会自动处理
includeMethods
和
excludeMethods
参数,如下面的拦截器类所示:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor. * ;
public class MyFilterInterceptor extends MethodFilterInterceptor
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this .name = name;
}
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception
{
System.out.println( " doIntercept " );
System.out.println(name);
return invocation.invoke();
}
}
MethodFilterInterceptor
的子类需要实现
doIntercept
方法(相当于
Interceptor
的
intercept
方法),如上面代码所示。在上面的代码中还有一个
name
属性,是为了读取拦截器的
name
属性而设置的,如下面的配置代码所示:
<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< package name ="demo" extends ="struts-default" namespace ="/test" >
< interceptors >
< interceptor name ="method" class ="interceptor.MultiMethodInterceptor" />
< interceptor name ="filter"
class ="interceptor.MyFilterInterceptor" >
< param name ="includeMethods" > abcd </ param >
< param name ="name" > 中国 </ param >
</ interceptor >
< interceptor-stack name ="methodStack" >
< interceptor-ref name ="method" />
< interceptor-ref name ="filter" />
< interceptor-ref name ="defaultStack" />
</ interceptor-stack >
</ interceptors >
< action name ="interceptor" class ="action.InterceptorAction" method ="abcd" >
< interceptor-ref name ="methodStack" />
</ action >
</ package >
</ struts >
再次访问 http://localhost:8080/struts2/test/ddd.action?action=test, Struts2 就会调用 MyFilterInterceptor的 doIntercept方法来输出 name属性值。如果将上面的 includeMethods参数值中的 abcd去掉,则 Action类的 abcd方法不会被执行。
发表评论
-
linux重启oracle 各种方法
2013-01-15 09:53 1319来自 : http://blog.sina.com.cn/s/ ... -
SVN服务器配置
2013-01-10 22:49 1255来自:http://air-blue55.blog.163.c ... -
网页编码就是那点事
2012-11-24 16:10 1024来自 : http://www.kuqin.com/webpa ... -
Tomcat 配置 CAS 的一个问题。unable to find valid certification path to requested target
2012-11-11 21:40 1641来自: http://blog.csdn.net/cool_ ... -
Tomcat SSL配置大全
2012-11-11 21:02 1242来源: http://www.iteye.com/topi ... -
Html中td自动换行问题
2012-10-25 17:57 1086来自:http://blog.csdn.net/dududu0 ... -
oracle 全角、半角转换,和oracle 的 DUMP函数
2012-06-18 09:56 2175to_single_byte(c)转换成半角 to_multi ... -
tomcat sso 配置
2012-05-29 23:18 1669源: http://www.oecp.cn/hi/single ... -
Hibernate 利用配置文件配置HQL/SQL
2012-05-21 17:14 1842Query.hbm.xml <?xml version= ... -
CAS工作流程
2012-05-19 22:25 1614CAS3.0的工作流程: 0.app将用户转发到CAS处, 并 ... -
jforum 表目录
2012-04-18 18:37 3030目 录 1、附件关系表JFORUM_ATTACH 2 2、附件 ... -
Jfroum集成cas单点登录
2012-04-17 21:35 16011.安装CAS 下载cas server ,设置好服务器端, ... -
JForum登录用例
2012-04-15 22:59 61521,键入用户名、密码,单击“登入”按钮,登录请求发送到/JFo ... -
tinyMCE 详细文档
2012-03-28 10:57 2158http://www.iwms.net/n2065c17.as ... -
JBPM3.1.4 相关表的 意义
2012-03-18 22:54 1031JBPM_ACTION action记录表 JBPM_DEC ... -
JBPM环境配置
2012-03-18 18:56 1855jBPM 需要数据库支持, j ... -
xfire 编写webservice例子
2012-02-23 16:51 1087来自 : http://www.blogjava.net/j ... -
ArrayUtils常用的用法
2012-02-21 10:51 1603// 1.打印数组 ArrayUtils.toString(n ... -
Tomcat自动缓存context.xml,导致在eclipse中修改后,不能立即启作用
2012-02-18 11:56 1808http://blog.csdn.net/shiqidide/ ... -
JavaScript CSS Style属性对照表
2012-02-11 22:36 1133CSS语法 (不区分大小写) JavaScript语法 (区分 ...
相关推荐
在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
在实际项目中,我们通常会结合Spring Security等安全框架,通过拦截器实现更复杂的权限控制。 总结,Struts2拦截器是其核心机制之一,它允许开发者以模块化的方式添加额外的功能,提高代码的可复用性和可维护性。...
本文将深入探讨如何使用Struts2实现拦截器,以及如何配置拦截器来实现用户权限拦截。 首先,我们需要了解拦截器的工作原理。在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序形成一个拦截...
### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...
拦截器在Struts2中扮演着至关重要的角色,它们是AOP(面向切面编程)的一个实现,用于在Action执行前后插入额外的功能。下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么...
要实现拦截不文明字迹,我们首先需要创建一个自定义的拦截器类。这个类需要继承自`com.opensymphony.xwork2.interceptor.AbstractInterceptor`或者实现`Interceptor`接口,并重写`intercept`方法。在`intercept`方法...
在本文中,我们将深入探讨如何实现Struts2与Spring的集成,以及利用拦截器来增强应用的功能。 首先,Struts2 是一个基于MVC设计模式的开源Web框架,它提供了强大的控制器层,使得开发者可以更方便地处理HTTP请求和...
通过上述方式,我们可以利用Struts2的拦截器机制有效地实现页面访问控制和用户注册功能,同时保持代码的清晰和模块化。在实际开发中,还可以结合其他拦截器,如性能监控、日志记录、事务管理等,进一步增强应用的...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
3. **实现拦截器** 实现Struts2拦截器需要继承`com.opensymphony.xwork2.interceptor.Interceptor`接口并实现其中的三个方法:`init()`、`destroy()`和`intercept()`。`init()`方法在程序启动时调用,`destroy()`在...
这篇博客文章“struts2拦截器实现权限控制”深入探讨了如何利用Struts2的拦截机制来执行用户访问权限的验证。 在Struts2中,拦截器是基于AOP(面向切面编程)的概念设计的,它们在Action调用前后执行,可以添加额外...
本教程将详细介绍如何使用Struts2的拦截器来实现用户权限登录功能。 ### 一、拦截器的原理与作用 1. **原理**:拦截器工作在Action调用之前,它通过观察者模式实现,当一个请求到达时,会按照配置的顺序依次执行...
标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...
这个"struts2拦截器应用小例子"可能包含了一个简单的拦截器实现,展示了如何在实际项目中集成和使用。通过这个例子,你可以学习到如何创建、注册拦截器,以及如何在Struts2框架中构建拦截器栈,从而更灵活地管理应用...
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...
在实际开发中,我们可以通过扩展Struts2的拦截器实现自定义功能。例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好...