浅谈 Struts2 拦截器

Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后处理一些逻辑。拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml 没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上(default Stack  默认拦截器栈中params拦截器)。

Struts2中自定义拦截器的步骤是:

1.定义拦截器类

2.为Action配置自定义的拦截器类

以定义一个检查是否有请求HelloWorldAction的权限为例:

定义拦截器类

Java代码  

  1. package com.tom.interceptors;
  2. import com.opensymphony.xwork2.ActionInvocation;
  3. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  4. import org.apache.struts2.ServletActionContext;
  5. //继承AbstractInterceptor
  6. public class PermissionCheckInterceptor extends AbstractInterceptor {
  7. @Override
  8. public String intercept(ActionInvocation invocation) throws Exception {
  9. //取permit请求参数,true表示有权限,其它表示没有权限
  10. String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];
  11. Boolean permit = Boolean.valueOf(value);
  12. if (Boolean.TRUE.equals(permit)) {
  13. return invocation.invoke(); //调用Action的方法,并返回那个方法对应的结果视图
  14. }
  15. //在checkResult视图上显示message信息
  16. ServletActionContext.getRequest().setAttribute("message", "Permission denies");
  17. return "checkResult"; //结果转到checkResult对应的视图
  18. }
  19. }

定义HelloWorldAction

Java代码  

  1. package com.tom.actions;
  2. public class HelloWorldAction {
  3. private String permit; //页面上输出permit的值
  4. private String message;
  5. public String getMessage() {
  6. return message;
  7. }
  8. public void setMessage(String message) {
  9. this.message = message;
  10. }
  11. public String execute() {
  12. this.message = "Permission OK, the permit  value is: " + permit;
  13. return "checkResult";
  14. }
  15. public String getPermit() {
  16. return permit;
  17. }
  18. public void setPermit(String permit) {
  19. this.permit = permit;
  20. }
  21. }

配置struts.xml

Xml代码  

  1. <!DOCTYPE struts PUBLIC
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. <struts>
  5. <package name="hellopkg" namespace="/hellons" extends="struts-default">
  6. <!--定义包级别拦截器,供包内action引用-->
  7. <interceptors>
  8. <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
  9. </interceptors>
  10. <action name="hi" class="com.tom.actions.HelloWorldAction">
  11. <!--引用权限检查拦截器,可以定义多个-->
  12. <interceptor-ref name="permissionCheckInterceptor"/>
  13. <result name="checkResult">/htmls/checkResult.jsp</result>
  14. </action>
  15. </package>
  16. </struts>

定义checkResult.jsp

Html代码  

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title></title>
  5. </head>
  6. <body>
  7. Check Result: ${message}
  8. </body>
  9. </html>

访问:

1. http://localhost:8080/hellons/hi?permit=false

页面显示:Check Result: Permission denies

2. http://localhost:8080/hellons/hi?permit=true

页面显示:Check Result: Permission OK, the permit value is: null

问题:

在访问http://localhost:8080/hellons/hi?permit=true时,结果显示permit的值为null,而根据Struts2的请求参数与Action字段的对应关系,value的值应该为true才对。这里为null表示Struts2并没有完成请求参数与action字段的自动绑定,原因是,当我们配置HelloWorldAction的拦截器时,把Struts2默认配置到Action中的拦截器覆盖了,这其中就包括参数绑定拦截器

问题解决

Struts2在配置拦截器时,采用的是一种递归的数据结构,拦截器栈interceptor-stack可以包含一组interceptor-ref也可以包含interceptor-stack。

Struts2为每个Action默认配置的一组拦截器放置于名称为defaultStack的拦截器栈中。所以,当为Action配置拦截器时,需要把默认拦截器配置上,并且默认拦截器应该在最前,因为默认拦截器包含了Struts基础和核心功能,应该让这些拦截器优先执行。

修改后的struts2.xml

Xml代码  

  1. <!DOCTYPE struts PUBLIC
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. <struts>
  5. <package name="hellopkg" namespace="/hellons" extends="struts-default">
  6. <!--定义包级别拦截器,供包内action引用-->
  7. <interceptors>
  8. <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
  9. </interceptors>
  10. <action name="hi" class="com.tom.actions.HelloWorldAction">
  11. <!--配置默认拦截器-->
  12. <interceptor-ref name="defaultStack"/>
  13. <!--引用权限检查拦截器,可以定义多个-->
  14. <interceptor-ref name="permissionCheckInterceptor"/>
  15. <result name="checkResult">/htmls/checkResult.jsp</result>
  16. </action>
  17. </package>
  18. </struts>

此时访问http://localhost:8080/hellons/hi?permit=true,页面显示Check Result: Permission OK, the permit value is: true

拦截器的其它配置方式

 1.定义并引用拦截器栈

Xml代码  

  1. <!DOCTYPE struts PUBLIC
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. <struts>
  5. <package name="hellopkg" namespace="/hellons" extends="struts-default">
  6. <!--定义包级别拦截器,供包内action引用-->
  7. <interceptors>
  8. <!--自定义拦截器-->
  9. <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
  10. <!--拦截器栈-->
  11. <interceptor-stack name="permissionCheckInterceptorStack">
  12. <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->
  13. <!--默认拦截器-->
  14. <interceptor-ref name="defaultStack"/>
  15. <!--自定义拦截器-->
  16. <interceptor-ref name="permissionCheckInterceptor"/>
  17. </interceptor-stack>
  18. </interceptors>
  19. <action name="hi" class="com.tom.actions.HelloWorldAction">
  20. <!--拦截器栈包含默认拦截器和自定义拦截器-->
  21. <interceptor-ref name="permissionCheckInterceptorStack"/>
  22. <result name="checkResult">/htmls/checkResult.jsp</result>
  23. </action>
  24. </package>
  25. </struts>

 2.定义默认拦截器

Xml代码  

  1. <!DOCTYPE struts PUBLIC
  2. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  3. "http://struts.apache.org/dtds/struts-2.3.dtd">
  4. <struts>
  5. <package name="hellopkg" namespace="/hellons" extends="struts-default">
  6. <!--定义包级别拦截器,供包内action引用-->
  7. <interceptors>
  8. <!--自定义拦截器-->
  9. <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
  10. <!--拦截器栈-->
  11. <interceptor-stack name="permissionCheckInterceptorStack">
  12. <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->
  13. <!--默认拦截器-->
  14. <interceptor-ref name="defaultStack"/>
  15. <!--自定义拦截器-->
  16. <interceptor-ref name="permissionCheckInterceptor"/>
  17. </interceptor-stack>
  18. </interceptors>
  19. <default-interceptor-ref name="permissionCheckInterceptorStack"/>
  20. <action name="hi" class="com.tom.actions.HelloWorldAction">
  21. <!--不配置拦截器,则如果包内有default-interceptor-ref定义的拦截器,则使用之。default-interceptor-ref定义的拦截器必须包含defaultStack拦截器栈-->
  22. <!--如果配置了拦截器,则default-interceptor-ref定义的拦截器不生效,defaultStack定义的拦截器也不生效-->
  23. <result name="checkResult">/htmls/checkResult.jsp</result>
  24. </action>
  25. </package>
  26. </struts>
时间: 2024-10-14 17:21:42

浅谈 Struts2 拦截器的相关文章

浅谈Struts2拦截器的原理与实现

拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式,很多业务逻辑都是靠拦截实现的,比如校验,验证登录权限(比如下载时跳转到登陆页面)等等.     过滤器是对整个的请求过程起作用!换句话说就是拦截器没有过滤器的范围广.过滤器是在java web中,你传入的request,response提前过滤掉一些信息

转载 - Struts2拦截器配置

出处:http://blog.csdn.net/axin66ok/article/details/7321430 目录(?)[-] 理解拦截器 1 什么是拦截器 2 拦截器的实现原理 拦截器的配置 使用拦截器 自定义拦截器 1 实现拦截器类 2 使用自定义拦截器 自定义拦截器示例 1 问题描述 2 实现权限控制拦截器类 3 配置权限控制拦截器 4 运行调试 1. 理解拦截器 1.1. 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段

struts2拦截器实现原理

拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的代码模块化并作为可重用的类.Struts2中的很多特性都是由拦截器来完成的.拦截是AOP的一种实现策略.在Webwork的中文文档的解释为:拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同

Struts2拦截器记录系统操作日志

前言 最近开发了一个项目,由于项目在整个开发过程中处于赶时间状态(每个项目都差不多如此)所以项目在收尾阶段发现缺少记录系统日志功能,以前系统都是直接写在每个模块的代码中,然后存入表单,在页面可以查看部分日志.这个系统并没有此要求,因此便想到了做一个系统通用的日志记录,主要记录数据有:操作时间.操作对象.操作方法.操作的一些参数以及操作结果.刚开始直接想到的是利用aspect实现aop记录日志,但实际应用中发现aspect并不能友好的拦截action,而是主要用作拦截service层业务.由于系统

Struts2拦截器概述

--------------------siwuxie095 Struts2 拦截器概述 1.Struts2 框架封装的很多功能都在 Struts2 的拦截器中 2.Struts2 框架中有很多拦截器,但这些拦截器不是每次 都执行,只有默认拦截器才会每次都执行 3.Struts2 默认拦截器的位置 「注意:默认拦截器中也有很多拦截器」 4.拦截器的执行 在 Action 对象创建之后,在 Action 方法执行之前 [made by siwuxie095]

笔记:Struts2 拦截器

配置拦截器 Struts.xml 配置文件中,使用<interceptor-/>来定义拦截器,有属性 name 表示拦截器的名称,class 表示拦截器的具体首先类,可以使用<param-/>子元素来配置拦截器的参数,配置示例: <package name="包名称" extends="抽象包名称"> <interceptors> <interceptor name="拦截器名称" class

Struts2 拦截器与Spring AOP的区别

在学习Spring AOP技术的同时,发现其实与以前做过的拦截器的功能很类似,于是开始抱着这两者之间有什么关系的问题进行深入研究. 我们知道struts2使用拦截器主要是用来处理用户的请求,OGNL的使用,表单验证 等. 而spring的拦截器,主要体现在AOP的事务管理方面,还有比如一些错误或者异常的日志的显示 也是通过配置spring的log拦截器来实现的. Struts的拦截器是针对Struts的,比如SSH项目都会去使用AOP ,如果是单纯的STRUTS项目 自然使用Struts本身的拦

【SSH2(实践篇)】--Struts2拦截器精解

上篇博客对Struts2的体系结构做了初步的了解,Struts2是以WebWork作为处理核心,并采用拦截器的机制来处理用户的请求,同时它还集成了Struts1丰富的标签库.另外上篇博客还对Struts2的配置使用进行了初步的介绍,下面将会集中讨论Struts2的拦截器. 一.拦截器 1.拦截器小介 拦截器的功能类似于web.xml文件中的Filter,能对用户的请求进行拦截,通过拦截用户的请求来实现对页面的控制.拦截器是在Struts-core-2.2.3.jar中进行配置的,原始的拦截器是在

Struts2 拦截器

一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故将这些权