Struts2中拦截器与过滤器

本文详细介绍了Struts2框架中的核心组件——拦截器,包括其与过滤器的区别、执行原理及配置方法。通过对比AOP思想,阐述了拦截器在处理请求前的数据预处理机制,以及如何通过配置XML实现自定义拦截器的注册和使用。

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

核心:Struts2的核心就是拦截器,是基于过滤器开发的,所以最好与filter联动对比学习

思想:拦截器是AOP思想,也就是面向切面编程,通俗点说就是纵向重复,横向提取,对aop不太理解的可以参考
https://blog.youkuaiyun.com/yanquan345/article/details/19760027

拦截器与过滤器的区别
1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调
2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5. 在action的生命周期中,拦截器可以多次被调用而过滤器只能在容器初始化时被调用一次


拦截器执行原理:
拦截器会在处理请求之前对数据进行处理,实质是代理

过滤器写法:
1.注册一个类继承抽象类(AbstractInterceptor)或者实现接口(Interceptor)
拦截非法登录用到HttpServletRequest request=ServletActionContext.getRequest();
2.配置拦截器
当拦截器没有匹配到局部的结果后会自动寻找全局变量
3.注册拦截器

eg:
1、注册拦截器:

package com.struts.util;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

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

public class MyFilter extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
        //Action是actionInvocation的调度者,actionInvocation是执行者
		HttpServletRequest request=ServletActionContext.getRequest();
		Object obj=request.getAttribute("user");
		if(obj==null){
			return "faillogin";
		}else{
			arg0.invoke();
		}
		return null;
	}

}

2、配置xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	<struts>
        <!-- 配置拦截器栈  其中package可理解为拦截器封装在一起 ,与项目中包名意思是不同 
             name:包的名称,任意书写名称,但是不能与其他包名重复
             extends:与oop中的继承差不多,实际上这里也是继承的意思
             abstract:是否是抽象的,默认值为false,申明自己不能实例化,只能被继承,
                      然后由子类实现它的若干方法,最后由子类实例化所以struts-default包中不能包
                      含任何<action/>定义,具体的定义则是由其子包来定义的
        -->
		<package name="pub" extends="struts-default" abstract="true">
			<interceptors>
            <!-- 注册自定义拦截器 -->
			<interceptor name="myFilter" class="com.struts.util.MyFilter"></interceptor>
			    <!-- 自定义拦截器进栈 讲究先进后出原则 -->
                <interceptor-stack name="stacklogin">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="myFilter"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
			<global-results>
			<result name= "faillogin">/err.jsp</result>
		</global-results>
		</package>
	</struts>


3、注册
 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	<struts>
		<package name="dept" extends="pub">
            <!--
                 dept_*:通配符
                 {1}:占位符
                 interceptor-ref:引用已经注册好的自定义拦截器
            -->
			<action name="dept_*" method="{1}" class="com.struts.action.DeptAction">
				<interceptor-ref name="stacklogin"></interceptor-ref>
				<result name="all">/dept/deptall.jsp</result>
				<result name="upp">/dept/update.jsp</result>
			</action>
		</package>
	</struts>

默认情况下,我们书写<package name="dept" extends="struts-default"></package>,而我们已经将拦截器封装在stack中,同时就继承了struts-default,所以我们在注册的时候直接调用就好,直接继承pub即可。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值