`

struts2中的拦截器

阅读更多

一、概述strust2中的拦截器
       拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作。Struts2设计的灵巧性,拦截器起了关键性的作用,当需要扩展Struts2功能时,只需要提供对应拦截器,并将它配置在Struts2容器中即可;如果不需要该功能时,也只需要取消该拦截器的配置即可。  
      Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default. xml文件中,其中name是拦截器的名字,就是以后我们使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的默认struts-default包,则可以自由使用它下面定义的拦截器,否则必须自己定义这些拦截器。struts2中默认的拦截器是defaultStack.
二、自定义拦截器

    自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器,自定义拦截器有三种方式定义。分别为实现Interceptor接口,继承抽象类AbstractInterceptor,继承MethodFilterInteceptor类。

方式一,实现Interceptor接口:

准备工作,使用LoginAction构建一个登录环境,当用户登录成功后,将用户信息保存在session中,LoginAction中的关键代码如下所示:

public String execute() throws Exception {
		if (userName.equals("struts2")) {
			ActionContext.getContext().getSession().put("user", userName);
			return "loginSuccess";
		} else {
			return "loginFailure";
		}
	}

 现在来测试TestAction中的execute()方法,访问的用户是否有权限访问。

TestAction的代码如下所示:

public class TestAction {

	private String message;
      //setter和getter方法
	public String execute() throws Exception {
		this.message = "test action execute方法已执行";
		return "success";
	}
}

 拦截器代码如下所示:

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class PermissionInterceptor implements Interceptor {

	private static final long serialVersionUID = -68905663987676273L;

	@Override
	public void destroy() {
		System.out.println("拦截器成功销毁!");

	}
	@Override
	public void init() {
		System.out.println("拦截器初始化成功!");
	}

	@Override
	public String intercept(ActionInvocation paramActionInvocation)
			throws Exception {
		System.out.println("开始拦截");
		Object user = ActionContext.getContext().getSession().get("user");
		if (user != null) {
			String result =  paramActionInvocation.invoke(); // 如果user不为null,代表用户已经登录,则允许执行action中的方法。
			System.out.println("结束拦截");
			return result;
		}
		ActionContext.getContext().put("message", "您没有权限执行该操作!");
		System.out.println("结束拦截");
		return "success";
	}
}

 result.jsp页面的代码如下所示:

<body>
${message }
 </body>

 1。为了使用此拦截器,我们必须将此拦截器进行注册,随后再在要使用此拦截器的Action中引用。即首先在<package>中注册,内容如下:

<interceptors>
    <interceptor name="permission" class="demo.action.PermissionInterceptor" />
</interceptors>

 注册完成后,如果我们要在TestAction中使用此拦截器,只需要在<action>中增加如下内容:

<interceptor-ref name="permission"></interceptor-ref>

但这种简单的配置会导致你自己的拦截器覆盖掉struts2默认的拦截器,也就是struts2默认的众多拦截器都将不再生效。

因为struts2中如文件上传,数据验证,封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。

最终struts.xml的配置文件如下所示:

<struts>
	<constant name="struts.multipart.maxSize" value="10701096" />
	<package name="myDemo" namespace="/demo" extends="struts-default">
		<interceptors>
			<interceptor name="permission" class="demo.action.PermissionInterceptor" />
			<interceptor-stack name="permissionStack">
				<interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->
				<interceptor-ref name="permission" />
			</interceptor-stack>
		</interceptors>
		<action name="login" class="demo.login.action.LoginAction">
			<result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>
			<result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>
		</action>
		<action name="test" class="demo.action.TestAction">
			<result>/WEB-INF/jsp/result.jsp</result>
			<interceptor-ref name="permissionStack" />
		</action>
	</package>
</struts>

 在启动整个应用程序时,控制台会打印出“拦截器初始化成功!”信息。

如果在未访问login.action之前访问test.action,则在resul.jsp页面中会显示"您没有权限执行该操作!"信息,同时控制台打印出了信息:

开始拦截
结束拦截

如果在访问login.action之后访问test.action,则在resul.jsp页面中会显示"test action execute方法已执行 !"信息,同时控制台打印出了信息:

开始拦截
结束拦截

 

实例流程分析:当我们为TestAction配置了拦截器时,并且有客户端请求此Action时,会首先被此拦截器拦住,然后执行System.out.println("开始拦截"),随后我们调用paramActionInvocation.invoke()方法,它会把请求继续传递给下一个拦截器,下一个拦截器也会继续执行相应代码后再调用invoke方法继续传递,直到请求到达最后一个拦截器,它会把请求传递给Action,比如,我们这里只用到了一个拦截器,当它执行完成后,会把请求直接转交到TestAction处理,TestAction处理完成后,它会返回结果给PermissionInterceptor拦截器。

 

    2。如果希望包下的所有action都使用自定义的拦截器,可以通过<default-interceptor-ref name=“permissionStack”/>把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。

如果配置成如下所示,则当你在登录页面点击提交按钮时,在进入login.action时也会执行拦截,控制台会打印出:

开始拦截
结束拦截

但同时会抛出异常信息,你永远也无法登录系统了。

<struts>
	<constant name="struts.multipart.maxSize" value="10701096" />
	<package name="myDemo" namespace="/demo" extends="struts-default">
		<interceptors>
			<interceptor name="permission" class="demo.action.PermissionInterceptor" />
			<interceptor-stack name="permissionStack">
				<interceptor-ref name="defaultStack" /><!-- 必须放置在"permission"的前面,因为定义的顺序就代表了执行的顺序 -->
				<interceptor-ref name="permission" />
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="permissionStack"/>
		<action name="login" class="demo.login.action.LoginAction">
			<result name="loginSuccess">/WEB-INF/jsp/success.jsp</result>
			<result name="loginFailure">/WEB-INF/jsp/failure.jsp</result>
		</action>
		<action name="test" class="demo.action.TestAction">
			<result>/WEB-INF/jsp/result.jsp</result>
		</action>
	</package>
</struts>
分享到:
评论

相关推荐

    struts2中拦截器的使用

    在Struts2中,拦截器的使用主要基于两个方面:配置文件中的声明式使用和注解的编程式使用。首先,我们来看看配置文件中的声明式使用。在struts.xml或类似的配置文件中,你可以通过`&lt;interceptor&gt;`元素定义拦截器,并...

    简单理解Struts2中拦截器与过滤器的区别及执行顺序

    Struts2 中拦截器与过滤器的区别及执行顺序 Struts2 中的拦截器(Interceptor)和过滤器(Filter)是两个不同的概念,虽然它们都可以影响请求的处理过程,但它们的作用域、执行顺序和实现机制都有所不同。 拦截器...

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

    拦截器栈是Struts2中拦截器的组织方式,它将多个拦截器按照预设的顺序组合成一个链式结构。在Action的执行过程中,这些拦截器会被依次调用,每个拦截器都有机会在Action方法执行前后进行干预。拦截器栈的顺序至关...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    Struts2拦截器及其用法详细说明

    在Struts2中,拦截器(Interceptors)扮演着核心角色,增强了框架的功能和灵活性。这篇文章将深入探讨Struts2拦截器的概念、工作原理以及如何在实际应用中使用它们。 **一、什么是Struts2拦截器** 拦截器是基于AOP...

    Struts2编码拦截器

    解决Struts2中的中文乱码。该代码是用作Struts2的拦截器中

    struts2 拦截器

    2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...

    struts2实现拦截器、

    在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它允许开发者在动作执行前后插入自定义逻辑,比如权限检查、日志记录、性能监控等。本文将深入探讨如何使用Struts2实现拦截器,以及如何配置拦截器来实现...

    Struts2拦截器源码

    首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...

    Struts2学习案例(拦截器)

    在Struts2中,拦截器是基于Java的动态AOP(面向切面编程)实现的,它可以在Action调用前后插入额外的逻辑,比如日志记录、权限验证、事务管理等。拦截器通过配置文件或者注解与Action关联,形成一个拦截器栈,每个...

    struts2 拦截器实例

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在Action执行前后插入自定义的逻辑,如日志、权限检查、事务管理等。现在我们将深入探讨Struts2的拦截器机制及其实例应用。 ### 一、Struts2拦截...

    使用struts2拦截器对登陆权限验证

    在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...

    Struts2拦截器实现权限控制demo

    在Struts2中,拦截器是实现业务逻辑控制和增强功能的重要机制,它们扮演着类似于AOP(面向切面编程)的角色,允许在动作执行前后插入自定义逻辑。在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何...

    详解Struts2拦截器

    拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截器的基本概念、工作原理以及其实现机制,并结合实际应用场景来展示如何利用拦截器提高代码的复用性与可维护性。...

    struts2拦截器

    在Struts2中,拦截器(Interceptor)是核心功能之一,用于增强应用的功能和处理业务逻辑。拦截器是基于AOP(面向切面编程)的概念,可以在动作执行前后插入额外的操作,比如日志记录、权限检查、数据验证等。 标题...

    struts2拦截器应用小例子

    在Struts2中,拦截器(Interceptor)扮演着核心角色,它们允许开发者在动作执行前后插入自定义的逻辑,如日志、权限检查、数据验证等。本示例将探讨如何在Struts2中使用拦截器。 首先,我们需要理解Struts2拦截器的...

    struts2常用拦截器

    struts2常用拦截器,struts2经常用到的拦截器,熟悉熟悉

    Struts2 拦截器

    在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的基本概念。拦截器是在Action调用之前和之后执行的一段代码,可以用来做日志记录、权限检查...

    难经3:Struts2,拦截器拦不住Result?

    拦截器是Struts2中的一个关键概念,它允许开发者在Action执行前后插入自定义的处理逻辑。例如,可以使用拦截器实现登录验证、日志记录、性能监控等功能。拦截器通过链式结构串联起来,形成一个执行栈,每个Action...

    struts2注解与拦截器demo

    该例子为struts2注解与拦截器demo,利用myEclipse8.5开发,导入刚才后,自动加载所需struts2的jar包,可以直接运行,是初学struts2注解、拦截器很好的例子,保证10分钟学会2种技术,愿意分享给大家。

Global site tag (gtag.js) - Google Analytics