Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后某些逻辑处理,拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上。
Struts2中自定义拦截器的步骤是:
1.定义拦截器类
2.为Action配置自定义的拦截器类
以定义一个检查是否有请求HelloWorldAction的权限为例
定义拦截器类
package com.tom.interceptors; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import org.apache.struts2.ServletActionContext; //继承AbstractInterceptor public class PermissionCheckInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { //取permit请求参数,true表示有权限,其它表示没有权限 String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0]; Boolean permit = Boolean.valueOf(value); if (Boolean.TRUE.equals(permit)) { return invocation.invoke(); //调用Action的方法,并返回那个方法对应的结果视图 } //在checkResult视图上显示message信息 ServletActionContext.getRequest().setAttribute("message", "Permission denies"); return "checkResult"; //结果转到checkResult对应的视图 } }
定义HelloWorldAction
package com.tom.actions; public class HelloWorldAction { private String permit; //页面上输出permit的值 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute() { this.message = "Permission OK, the permit value is: " + permit; return "checkResult"; } public String getPermit() { return permit; } public void setPermit(String permit) { this.permit = permit; } }
配置struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <!--定义包级别拦截器,供包内action引用--> <interceptors> <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/> </interceptors> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--引用权限检查拦截器,可以定义多个--> <interceptor-ref name="permissionCheckInterceptor"/> <result name="checkResult">/htmls/checkResult.jsp</result> </action> </package> </struts>
定义checkResult.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title></title> </head> <body> Check Result: ${message} </body> </html>
访问:
1. http://localhost:8668/hellons/hi?permit=false
页面显示:Check Result: Permission denies
2. http://localhost:8668/hellons/hi?permit=true
页面显示:Check Result: Permission OK, the permit value is: null
问题:
在访问http://localhost:8668/hellons/hi?permit=true时,结果显示permit的值为null,而根据Struts2的请求参数与Action字段的对应关系,value的值应该为true才对。这里为null表示Struts2并没有完成请求参数与action字段的自动绑定,原因是,当我们配置HelloWorldAction的拦截器时,把Struts2默认配置到Action的拦截器覆盖了,这其中就包括参数绑定拦截器
问题解决
Struts2在配置拦截器时,采用的是一种递归的数据结构,拦截器栈interceptor-stack可以包含一组interceptor,interceptor-stack也可以包含interceptor-stack。
Struts2为每个Action默认配置的一组拦截器放置于名称为defaultStack的拦截器栈中。所以,当为Action配置拦截器时,需要把默认拦截器配置上,并且默认拦截器应该在最前,因为默认拦截器包含了Struts基础和核心功能,应该让这些拦截器优先执行。
修改后的struts2.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <!--定义包级别拦截器,供包内action引用--> <interceptors> <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/> </interceptors> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--配置默认拦截器--> <interceptor-ref name="defaultStack"/> <!--引用权限检查拦截器,可以定义多个--> <interceptor-ref name="permissionCheckInterceptor"/> <result name="checkResult">/htmls/checkResult.jsp</result> </action> </package> </struts>
此时访问http://localhost:8668/hellons/hi?permit=true,页面显示Check Result: Permission OK, the permit value is: true
拦截器的其它配置方式
1.定义并引用拦截器栈
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <!--定义包级别拦截器,供包内action引用--> <interceptors> <!--自定义拦截器--> <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/> <!--拦截器栈--> <interceptor-stack name="permissionCheckInterceptorStack"> <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )--> <!--默认拦截器--> <interceptor-ref name="defaultStack"/> <!--自定义拦截器--> <interceptor-ref name="permissionCheckInterceptor"/> </interceptor-stack> </interceptors> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--拦截器栈包含默认拦截器和自定义拦截器--> <interceptor-ref name="permissionCheckInterceptorStack"/> <result name="checkResult">/htmls/checkResult.jsp</result> </action> </package> </struts>
2.定义默认拦截器
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hellopkg" namespace="/hellons" extends="struts-default"> <!--定义包级别拦截器,供包内action引用--> <interceptors> <!--自定义拦截器--> <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/> <!--拦截器栈--> <interceptor-stack name="permissionCheckInterceptorStack"> <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )--> <!--默认拦截器--> <interceptor-ref name="defaultStack"/> <!--自定义拦截器--> <interceptor-ref name="permissionCheckInterceptor"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="permissionCheckInterceptorStack"/> <action name="hi" class="com.tom.actions.HelloWorldAction"> <!--不配置拦截器,则如果包内有default-interceptor-ref定义的拦截器,则使用之。default-interceptor-ref定义的拦截器必须包含defaultStack拦截器栈--> <!--如果配置了拦截器,则default-interceptor-ref定义的拦截器不生效,defaultStack定义的拦截器也不生效--> <result name="checkResult">/htmls/checkResult.jsp</result> </action> </package> </struts>
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...
### 四、Struts2内置拦截器 Struts2提供了一些内置的拦截器,如: 1. **Params拦截器**:负责从请求中提取参数并设置到Action的属性。 2. **Prepare拦截器**:初始化Action,调用`prepare()`方法。 3. **Exception...
在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...
### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。...
标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...
当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...
在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
拦截器是Struts2框架的核心组成部分,它们在请求处理流程中起到了关键的作用。在本文中,我们将深入探讨Struts2拦截器的工作原理。 ### 一、拦截器概念 拦截器是基于Java的动态代理机制实现的,它允许我们在Action...
#### 四、Struts2拦截器的配置 在`struts.xml`中配置拦截器的方式有多种,包括指定特定Action的拦截器、全局拦截器等。以下是一个具体的例子: ```xml <package name="struts-shop" extends="struts-default"> ...
Struts拦截器是Java Web开发中的重要概念,尤其在基于Struts 2框架的应用中扮演着核心角色。这个"struts拦截器的例子"提供了一个学习和理解拦截器工作原理的起点,非常适合对这一主题感兴趣的初学者。 Struts 2框架...
Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...
Struts2.X 拦截器是Apache Struts框架的核心组件之一,它是基于拦截器模式实现的,使得开发者能够方便地扩展和定制应用程序的行为。在Struts2中,拦截器扮演着中间件的角色,它在Action执行前后进行处理,可以进行如...
Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。拦截器是Struts2框架的核心组件之一,用于增强应用的功能,比如权限验证、日志记录、数据校验等。 ...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...