Struts2的拦截器是个好利器!尤其是自定义拦截器,以下是我个人整理的很详细的整个流程,希望给大家带来帮助,有更好见解的希望可以提出宝贵的意见。
原理:
a) Web浏览器发送请求
b) 首先通过一组Struts2默认的拦截栈 dispatcher (或者 ServletFilter)
c) 自定义interceptor(拦截器)
d) Action
e) Result
struts.xml配置如下:
<package name=”default” namespace=”/” extends=”struts-default”> <--所有的配置都应放在package中--> <interceptors> <-- 所有的拦截器自定义的配置和引用、已经拦截栈的定义都应放在interceptors中--> <-- 自定义拦截器 name指定自定义拦截器的引用名称 class 指定该拦截器的实现类(完整路径) --> <interceptor name="sessionCheck" class="com.cqrcb.perinvite.interceptor.AuthorityInterceptor" /> <-- 自定义拦截栈 name 指定自定义拦截栈的引用名称 --> <interceptor-stack name="sessionCheckStack"> <-- name为所要引用的拦截器的引用名称 刚才定义了一个name为 sessionCheck的拦截器,则引用就为 sessionCheck--> <-- 每一个自定义的拦截栈都应该必须配上defaultStack拦截栈,该拦截栈是Struts2默认的拦截栈,里面封装了一组拦截器--> <interceptor-ref name="defaultStack" /> <interceptor-ref name="sessionCheck" /> </interceptor-stack> </interceptors> < -- 配置全局默认的Action -- > <default-action-ref name="IndexAction" /> < -- 配置全局默认的result-- > <global-results> <-- 配置token的invalid.token的返回视图,即当页面重复提交,页面将自动转到/error.jsp页面并提示 -- > <result name="invalid.token">/error.jsp</result> <result name="error">/error.jsp</result> <-- 配置name为backhome的resule,重定向为IndexAction-- > <result name="backhome" type="redirectAction">IndexAction</result> <-- 配置name为testChain的resule, 转发跳转到testAction -- > <result name="testChain" type="chain ">testAction</result> </global-results> < --使用拦截器有两种方式,annoction(注解)和xml配置,以下是XML配置--> <action name="testAction" class="com.cqrcb.perinvite.resume.action.testAction"> <-- 在此Action访问之前引入sessionCheckStack拦截栈 name为拦截栈定义的引用名称-- > <-- 此sessionCheckStack已经包含了自定义拦截器和Struts2的默认拦截栈,所以直接引用sessioncheckstack即可-- > <interceptor-ref name=" sessionCheckStack "/> <-- 如果直接引用自定义的拦截器,即没有包含默认的拦截栈,则需要引用Struts2的默认拦截栈,以下-- > <interceptor-ref name=”testInter”/> <interceptor-ref name=”defaultStack”/> <-- 一个Action中只要有一个defaultStack即可,如果引用的拦截栈有了defaultStack,则就不必再引用defaultStack,否则,引之-- > <result name="success"> Success.jsp </result> <result name="input"> input.jsp </result> </action> </package>
annoction注解中使用拦截器和拦截栈
//直接在类名称的上端写入即可,value中指定要引入的拦截器的名称即可 @InterceptorRef(value="token") //拦截栈的引用,蓝色字体即拦截栈的引用名称 @InterceptorRefs(@InterceptorRef("sessionCheckStack"))
自定义拦截器的javabean
package com.cqrcb.perinvite.interceptor; import com.cqrcb.perinvite.logon.action.IndexAction; import com.netbank.pub.vo.core.PbClientInfoVO; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * 权限拦截Action * @author wangyupeng * */ //继承 AbstractInterceptor 类 public class AuthorityInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 4546936882066035745L; //重写intercept方法 public String intercept(ActionInvocation invocation) throws Exception { //获取Action的拦截路径 ActionContext ax = invocation.getInvocationContext(); //获取Action对象 Object action = invocation.getAction(); // 对IndexAction不做该项拦截 action instanceof IndexAction 解释为如果Action的实例为IndexAction if (action instanceof IndexAction) { //如果是IndexAction,则进行执行,即不做拦截 return invocation.invoke(); } //获取session中key为pinfo的对象 PbClientInfoVO pinfo =(PbClientInfoVO) ax.getSession().get("pinfo"); if(pinfo==null){ //如果pinfo为null,则返回全局result为backhone的视图 return "backhome"; } //如果都不为false,则不做拦截 return invocation.invoke(); } }
struts2的自定义拦截器有很多方式,本文的内容是前置拦截,即获取到action的请求所做的拦截。struts2还有后置拦截和中间拦截,这两种也是很常用的,有时间整理完之后我会发到博客,大家一起探讨。