struts2 拦截器(interceptor)

配置主要在struts.xml

<!-- 拦截器 -->
<interceptors>
<interceptor name="default" class="com.formwork.struts2.DefaultIntecetor"></interceptor>
<!-- 栈拦截器 -->
<interceptor-stack name="">
<interceptor-ref name=""></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 配置默认拦截器 -->
<default-interceptor-ref name="default"></default-interceptor-ref>

<action name="login" class="com.formwork.struts2.LoginAction">
			<result name="success" type="dispatcher">/index.jsp</result>
			<result name="error" type="dispatcher">/WEB-INF/page/error.jsp</result>
			<result name="login" type="dispatcher">/WEB-INF/page/index.jsp</result>
			<result name="welcome" type="dispatcher">/WEB-INF/page/welcome.jsp</result>
			<!-- 使用拦截器 -->
			<interceptor-ref name="default"></interceptor-ref>
		</action>

注: 1,普通拦截器     

      2,栈拦截器   就是把一群拦截器合并为一个  按照一定顺序执行

      3,拦截器要配置在action前  

拦截器类的实现:

package com.formwork.struts2;

import java.util.Map;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 * 默认字段拦截器,继承AbstractInterceptor
 * **/
public class DefaultIntecetor extends AbstractInterceptor {
	private Logger log = Logger.getLogger(this.getClass().getName());
	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		//ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。
		//getActionProxy(),getResultCode();getActionContext .getParameters() 方法  可看API查看
		
		Map<String,Object> paramters = arg0.getInvocationContext().getParameters();
		if(paramters.isEmpty()){
			return Action.LOGIN;
		}else{
			log.info("登陆记录:"+paramters.get("userName")+":"+paramters.get("userPsw"));
		}
		return arg0.invoke();
	}

}

注:拦截器的实现分为两类

        1,字节拦截器   实现是继承 AbstractInterceptor

        2,方法拦截器   实现是继承 MethodFilterInterceptor  配置的时候唯一的区别就是在使用的时候

<interceptor-ref name="default">
			    <!-- 指定不拦截方法 -->
				<param name="excludeMethods">login</param>
				<!-- 指定拦截方法 -->
				<param name="includeMethods">error</param>
			</interceptor-ref>


3,拦截器拦截顺序(重点)

    相关类API:

AbstractInterceptor

        共三个方法  我们主要实现intercetor  这里是业务代码处理的地方

MethodFilterInterceptor:

struts2 拦截器(interceptor)_第1张图片

        这上面我们可以我们配置的action的result的name来做拦截或者不拦截;


ActionInvocation:

        ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。他的方法有很多  这里只记录 invoke;建议详细看一下这个类


注:

拦截器的调用顺序:

invoke(),它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。

intercept() ,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。




你可能感兴趣的:(struts2 拦截器(interceptor))