下面给一张图片表示Struts2拦截器的处理流程。
通过这个流程图,我们可以看出一个完整的请求大概的过程为:
请求 -->filter 控制器 --> 拦截器 1/ 拦截器 2-->Action-->Result--> 拦截器 2/ 拦截器 1--> 响应输出
可以清楚地看出,当请求到服务器的时候首先会经过拦截器,然后当响应到用户界面的时候又会经过拦截器。
下面我们来实现一个自定义的拦截器
1. 编写拦截器实现类
实现 Interceptor 接口(或者继承 AbstractInterceptor )
如:
MyInterceptor.java 文
package cn.test.interceptor; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class MyInterceptor extends AbstractInterceptor{ //如果下面逻辑执行了invoke方法,返回值无效;如果没有执行invoke方法返回String作为result标识符 public String intercept(ActionInvocation ai) throws Exception { System.out.println("在Action之前调用"); //登录检查 Map<String,Object> session = ActionContext.getContext().getSession(); String username = (String)session.get("user"); if(username!=null){//登录的用户 ai.invoke();//调用后续拦截器或Action+Result System.out.println("在Result之后调用"); return null; }else{//未登录 return "login";//找<result name="login"> } } }
2. 在 struts.xml 中配置拦截器
<interceptors> <interceptor name="myinter" class="cn.test.interceptor.MyInterceptor"/> </interceptors>
3. 使用拦截器
只需要在action对拦截器进行引用即可:
<interceptor-ref name="myinter"/>
一旦使用了自定义的拦截器,那么struts2框架就不会去加载默认的拦截器了,因此有些功能会受损,这时候需要再次引用默认拦截器:
<interceptor-ref name="defaultStack"/>
比如下面的struts.xml案例:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="demo" extends="struts-default" namespace="/"> <interceptors> <interceptor name="myinter" class="cn.test.interceptor.MyInterceptor"/> </interceptors> <!--这里把result提升到全局是为了,插件也能够调用--> <global-results> <result name="login" type="redirectAction"> <!--跳转到/tologin--> <param name="actionName">tologin</param> <param name="namespace">/</param> </result> </global-results> <action name="delete" class="deleteAction"> <!--显示调用自定义的过滤器和默认的过滤器--> <interceptor-ref name="myinter"/> <interceptor-ref name="defaultStack"/> <result name="success" type="redirectAction"> <param name="actionName">list</param> <param name="namespace">/</param> </result> <result name="error" type="dispatcher">/WEB-INF/error.jsp</result> </action> </package> </struts>