标签:
配置主要在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:
这上面我们可以我们配置的action的result的name来做拦截或者不拦截;
ActionInvocation:
ActionInvocation就是Action的调用者。ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。他的方法有很多 这里只记录 invoke;建议详细看一下这个类
注:
拦截器的调用顺序:
invoke(),它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。
intercept() ,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。
标签:
原文地址:http://my.oschina.net/u/1249631/blog/378308