攔截器是struts2的一個功能,在訪問Action的時候會調用struts2的攔截器(若是存在的話)。攔截器既能夠做用於Action的前面,將傳遞的參數修改;也能夠做用於Action的後面,將返回的結果轉換。他是AOP(面向切面編程)的一種實現。 java
要實現攔截器,有三種方式: 編程
實現Intercept接口(com.opensymphony.xwork2.interceptor.Interceptor) session
實現AbstractInterceptor抽象類(com.opensymphony.xwork2.interceptor.AbstractInterceptor) jsp
實現MethodFilterInterceptor抽象類(com.opensymphony.xwork2.interceptor.MethodFilterInterceptor)。 this
Interceptor有如下方法必須實現: spa
public class AInterceptor implements Interceptor{ public void init(){} public void destroy(){} public String intercept(ActionInvocation invocation) throws Exception{ return invocation.invoke() } }
init方法在攔截器初始化的時候執行 excel
AbstractInterceptor和MethodFilterInterceptor是Interceptor的一個模板,簡化了Interceptor的實現。 code
其中AbstracetInterceptor已經實現了init(),destroy方法。而MethodFilterInterceptor則多了includeMethods和excludeMethods兩個屬性,includeMethods決定哪些方法須要攔截,exceludeMethods決定哪些方法不須要攔截。 xml
-----------------------------------------------------例子--------------------------------------------------- 對象
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; import java.util.Map; public class HeheInterceptor implements Interceptor { public void init(){ System.out.println("this is init !"); } public void destroy(){ System.out.println("this is destroy !"); } public String intercept(ActionInvocation invocation) throws Exception{ try{ Thread.sleep(10000); }catch (InterruptedException e){ e.printStackTrace(); } Map session = invocation.getInvocationContext().getSession(); Operator operator = (Operator)session.get("cms_operator"); System.out.println("hello the user's name is "+operator.getLoginName()); System.out.println("hello the user's password is "+operator.getPassword()); operator.setLoginName("hehe"); return invocation.invoke(); } }在以上代碼中實現步驟是這樣的:
1.初始化的時候會執行init方法
2.被攔截時進入interceptor方法
3.「沉睡」10秒鐘
4.將一個帳號的名字修改
5.讓action繼續執行
6.當該對象被回收時執行destory方法
struts的配置文件能夠這樣寫:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="default" extends="struts-default"> <interceptors> <interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/> <interceptor-stack name="default"> <interceptor-ref name="hehe" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="default" /> </package> <package name="user" extends="default" namespace="/"> <action name = "login" class="AAction" method="login"> <result name="error">/WEB-INF/jsp/login.jsp</result> <result name="success">/WEB-INF/jsp/main.jsp</result> </action> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "struts-2.1.dtd" > <struts> <package name="default" extends="struts-default"> <interceptors> <interceptor name="hehe" class="moretv.cms.interceptor.HeheInterceptor"/> </interceptors> </package> <package name="user" extends="default" namespace="/"> <action name = "login" class="AAction" method="login"> <interceptor-ref name="hehe" /> <result name="error">/WEB-INF/jsp/login.jsp</result> <result name="success">/WEB-INF/jsp/main.jsp</result> </action> </package> </struts>
第一種方法全部繼承了default的package下的action都會被hehe攔截器攔截
第二種方法則能夠在須要的時候被攔截