SSH学习之Struts2中的拦截器

回忆

在上一篇SSH学习之Struts2中的校验中已经学习了Struts2框架提供的两种后台校验数据的方式,接下来想要介绍的也是和这些有些关系的内容——拦截器
拦截器这个概念只是Struts框架中的概念,其他的并没有这个概念。如果学过过滤器这个概念的话,理解这个就会很方便。拦截器的理解和过滤器的作用也是相似的。

拦截器概述

Struts2是一个开源框架,封装了很多常用的功能,比如属性封装、模型驱动、数据校验、文件上传等等。但是这些功能的实现一般是包含拦截器中的。所以说,Struts2有很多默认的拦截器。

拦截器和过滤器的区别

过滤器理论上可以拦截任意内容,比如jsp、html、图片等。
拦截器只拦截Action的请求。

拦截器的执行时间

拦截器的执行时间是action对象创建之后,方法执行之前。(这个和验证相似)

自定拦截器

在Struts2框架中已经封装好了基本的一些功能,但是在实际开发中项目的需求不仅仅只需要默认的拦截器,还需要一些自己定义某些功能的拦截器,比如用户权限访问等。
自定义的拦截器常用的有两种方式:实现Interceptor接口继承了实现Interceptor接口的实现类

实现Interceptor接口

package interceptor;

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

public class UserInterceptor implements Interceptor {
	@Override
	public void destroy() {
	}
	@Override
	public void init() {
	}
	
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		//拦截功能主要在这个方法中写,比如判断用户是否已经登录
		return null;
	}

}

继承Interceptor接口的实现类

比较常用的是MethodFilterInterceptor实现类,因为该方法可以指定action中应该拦截和不应该拦截的方法。
package interceptor;

import org.apache.struts2.ServletActionContext;

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

public class User2Interceptor extends MethodFilterInterceptor {

	@Override
	protected String doIntercept(ActionInvocation arg0) throws Exception {
		Object obj = ServletActionContext.getRequest().getSession().getAttribute("user");
		if(obj != null) {
			return arg0.invoke();
		}
		return "notLogin";
	}

}
     arg0.invoke()方法其实就是放行,继续执行下一个拦截器

配置自定义拦截器

<?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="yxd" extends="struts-default" namespace="/">
    
    	<!-- 1.在package标签声明自定义拦截器 -->
    	<interceptors>
    		<interceptor name="loginInterceptor" class="com.yxd.interceptor.LoginInterceptor"></interceptor>
    	</interceptors>
    
    	<action name="user_*" class="com.yxd.action.UserAction" method="{1}">
    	
			<!-- 2.在action标签使用自定义拦截器 -->
    		<interceptor-ref name="loginInterceptor">
				<!-- name值是固定的,表示不对该方法进行拦截
					 标签值是方法名
				-->
    		 	<param name="excludeMethods">login</param>
    		</interceptor-ref>
    		 <interceptor-ref name="defaultStack"></interceptor-ref>
    		 
    		 <result name="add" type="redirect">/add.jsp</result>
    		
    		 <result name="update" type="redirectAction">user_add</result>
    		 
    		 <result name="loginSuccess" type="dispatcher">/loginSuccess.jsp</result>
    		 <result name="login" type="dispatcher">/login.jsp</result>
    	</action>
    	
    </package>
    
</struts>

关于拦截器的配置除了以上的方法外还可以这样。重新设置默认的拦截器栈。
<interceptors>
	<interceptor name="loginInterceptor" class="com.lab.interceptor.admin.AdminLoginIntercept">
		<param name="excludeMethods">loginPage,login</param>
	</interceptor>
	<interceptor-stack name="myDefault">
		<interceptor-ref name="loginInterceptor" />
		<interceptor-ref name="defaultStack" />
	</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefault" />

多余的话

这是我的一些理解了,请多多见谅奋斗





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值