struts2学习笔记 -- day09 Struts2的拦截器

一、Struts2中的拦截器

1、什么是struts2的拦截器

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者在定义的action执行的前后加入执行的代码,也可以在一个action执行前阻止其执行。也就是说它提供了一种可以提取action中可重用代码,统一管理和执行的方式。

拦截器链 (Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

2、过滤器和拦截器的区别

过滤器是servlet规范中的一部分,任何java web工程都可以使用。

拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只有进入struts2核心内部之后,才会起作用,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

3、拦截器的作用

Struts2中的很多功能都是由拦截器完成的。struts2配置文件中有一个名称为struts-default.xml的配置文件,该配置文件中有struts2框架给我们提供的很多拦截器。比如:servletConfig,staticParam,params,modelDriven等等。我们通过实现接口方式获取ServletAPI以及模型驱动封装请求参数,都是拦截器在帮我们做。

4、拦截器的执行时机

在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构。具体可参考下图:


5、拦截器的类视图

下图为拦截器的类结构视图


二、自定义拦截器

1、编写自定义拦截器的方式

第一种:定义一个类,实现Interceptor接口

第二种:定义一个类,继承AbstractInterceptor

第三种:定义一个类,继承MethodFilterInterceptor  -- 常用

2、使用方式二编写自定义拦截器的步骤

(1)、编写一个类,继承AbstractInterceptor

package cn.itcast.interceptor;

import org.apache.struts2.ServletActionContext;

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

/**
 * 自定义拦截器类
* @Description: TODO  
* @date 2017年8月11日 下午8:14:00 
* @version V1.0
 */
public class CheckLoginInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Object user = ServletActionContext.getRequest().getSession().getAttribute("user");
		if(user == null){
			return "login";
		}
		//放行操作
		return invocation.invoke();
	}

}

(2)、在struts2配置文件中声明并引用拦截器

<struts>
	<package namespace="/user" name="struts2" extends="struts-default">
	
		<!-- 声明拦截器 -->
		<interceptors>
			<interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor>
		</interceptors>
		
		<action name="custAction" class="cn.itcast.web.UserAction" method="value">
			<!-- 动作类中引用拦截器
				注意:如果不引用自定义拦截器,拦截器栈就会起作用,
					但此处如果引用了自定义拦截器,默认的拦截器栈就会失效,需要配置默认拦截器栈
			 -->
			<interceptor-ref name="checkLogin"></interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

3、抽取默认拦截器栈

<struts>
	<package namespace="/user" name="struts2" extends="struts-default">
	
		<!-- 声明拦截器 -->
		<interceptors>
			<interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor>
			<!-- 声明拦截器栈 -->
			<interceptor-stack name="myDefaultStack">
				<!-- 引用自定义的拦截器 -->
				<interceptor-ref name="checkLogin" />
				<!-- 引用默认拦截器 -->
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		<!-- 将自定义的拦截器栈替换默认的拦截器栈 -->
		<default-interceptor-ref name="myDefaultStack" />
		
		<action name="custAction" class="cn.itcast.web.UserAction" method="value">
			<!-- 动作类中引用拦截器
				注意:如果不引用自定义拦截器,拦截器栈就会起作用,
					但此处如果引用了自定义拦截器,默认的拦截器栈就会失效,需要配置默认拦截器栈
			 -->
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

注意:将默认的拦截器栈替换为自定义的拦截器栈,此时所有方法都进行拦截,但有些方法我们不需要拦截,应该怎么配置?配置如下

4、使用第三种拦截方式,并且配置默认放行或拦截的方法

动作类

import org.apache.struts2.ServletActionContext;

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

/**
 * 自定义拦截器类,第三种
* @Description: TODO  
* @date 2017年8月11日 下午8:14:00 
* @version V1.0
 */
public class CheckLoginInterceptor extends MethodFilterInterceptor {

	@Override
	public String doIntercept(ActionInvocation invocation) throws Exception {
		Object user = ServletActionContext.getRequest().getSession().getAttribute("user");
		if(user == null){
			return "login";
		}
		//放行操作
		return invocation.invoke();
	}

}

struts.xml配置

		<!-- 声明拦截器 -->
		<interceptors>
			<interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor>
			<!-- 声明拦截器栈 -->
			<interceptor-stack name="myDefaultStack">
				<!-- 引用自定义的拦截器 -->
				<interceptor-ref name="checkLogin" >
					<!-- 此处配置默认拦截或者不拦截的方法
						name:excludeMethods 指的是默认不拦截的方法
							 includeMethods 指的是默认拦截的方法
						后面的取值是动作类中的方法名称,可以写多个,之间用 "," 号隔开
					 -->
					<param name="excludeMethods">login,logout</param>
				</interceptor-ref>
				<!-- 引用默认拦截器 -->
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>
		</interceptors>
		<!-- 将自定义的拦截器栈替换默认的拦截器栈 -->
		<default-interceptor-ref name="myDefaultStack" />


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值