Struts2拦截器

本文深入解析了拦截器(Interceptor)的概念与工作原理,强调其在框架如Struts2中的核心作用,包括数据校验、类型转换等功能。阐述了拦截器与过滤器的区别,并详细介绍了如何在Struts2中实现和配置拦截器,包括使用拦截器栈进行统一管理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器概述

拦截器(Interceptor)就是当一个Action被执行之前与执行之后的一段代码。

许多框架的核心功能就是通过拦截器实现的。

比如Struts 2 中的数据校验,类型转换,文件上传,国际化,防止重复提交等。

拦截器是可插拔的,需要时插入,不需要时拔出。 可以为每个Action配置拦截器,也可以根据业务需求编写自己的拦截器。

拦截器与过滤器的区别

拦截器是基于JAVA反射机制的,而过滤器不是 过滤器依赖于servlet容器,

而拦截器不依赖 拦截器只能对Action起作用,而过滤器则可以对几乎所有请求

拦截器可以访问Action上下文,值栈中的对象,而过滤器不能。

拦截器思想

面向切面的编程(AOP) 把通用的功能从系统中提出来,单独处理,实现了软件的重用

 

拦截器使用方法:

1,实现Interceptor接口 映射拦截器

//XML配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
    <constant name="struts.custom.i18n.resources" value="res"></constant>
	<package name="user" extends="struts-default" namespace="/">
		<interceptors>
		  <interceptor name="inter1" class="com.st.SimpleInterceptor1"></interceptor>
		</interceptors>
		<action name="test" class="com.st.TestAction">
		  <interceptor-ref name="inter1"></interceptor-ref>				  
          <result>success.jsp</result>
		</action>
	</package>
</struts>

-------------------------------------
//JAVA拦截器代码
package com.st;

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



public class SimpleInterceptor1 implements Interceptor {

	public void destroy() {
		System.out.println("SimpleInterceptor1.destroy()");
	}

	public void init() {
		System.out.println("SimpleInterceptor1.init()");
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		TestAction ta = (TestAction)invocation.getAction();
		//ta.setName("denny");
		System.out.println("SimpleInterceptor1");
		return invocation.invoke();
	}
	
}

2,继承com.opensymphony.xwork2.interceptor.AbstractInterceptor抽象类实现拦截器

package com.st;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class SimpleInterceptor2 extends AbstractInterceptor  {

	public void destroy() {
		System.out.println("SimpleInterceptor2.destroy()");
	}

	public void init() {
		System.out.println("SimpleInterceptor2.init()");
	}

	public String intercept(ActionInvocation invocation) throws Exception {
		TestAction ta = (TestAction)invocation.getAction();
		//ta.setName("denny");
		System.out.println("SimpleInterceptor2");
		return invocation.invoke();
	}
	
}

使用拦截器栈管理拦截器

在很多时候,有些指定的拦截器需要被多个Action所使用,这个时候,如果我们为每一个Action都分别配置拦截器的话,不仅麻烦,而且不利后期的维护,此时就需要用到拦截器栈。 所谓拦截器栈就是将一些拦截器组合起来进行统一管理。

------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
    <constant name="struts.custom.i18n.resources" value="res"></constant>
	<package name="user" extends="struts-default" namespace="/">
		<interceptors>
		  <interceptor name="inter1" class="com.st.SimpleInterceptor1"></interceptor>
		  <interceptor-stack name="mystack">
		  	<interceptor-ref name="inter1"></interceptor-ref>
		  </interceptor-stack>
		</interceptors>
		<action name="test" class="com.st.TestAction">
		    <interceptor-ref name="mystack"></interceptor-ref>
		    <result>success.jsp</result>
		</action>
	</package>
</struts>

struts2中使用拦截器来检察表单是否重复提交,

他采用同步令牌的方式来实现对表单重复提交的判断,需要使用到<s:token />标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值