當struts2經過輸入校驗階段(struts2系列---輸入校驗)后,接著將調用execute()業(yè)務邏輯方法。有時我們需要在執(zhí)行execute()方法之前先進行比如登陸驗證之類的判斷。只有登陸過的用戶才能進行業(yè)務操作。這時就需要用到Struts2的攔截器Interceptor。
以下為struts2攔截器用法的簡單小結:
1.
struts.xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<interceptors>
<!--定義攔截器-->
<interceptor name="isLogin" class="com.test.action.interceptor.IsLoginInterceptor"></interceptor>
<!--
<!-- 自定義攔截器棧-->
<interceptor-stack name="myStack">
<interceptor name="isLogin"/>
<interceptor name="defaultStack"/>
</interceptor-stack>
-->
</interceptors>
<!--
<default-interceptor-ref name="myStack"></default-interceptor-ref>
-->
<!--定義全局跳轉頁-->
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
<action name="updateMessage" class="com.test.action.UserAction">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
<result name="failure">/index.jsp</result>
<!--放入上面自定義的攔截器-->
<interceptor-ref name="isLogin"/>
<!--放入struts2默認的攔截器棧-->
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
當執(zhí)行execute()方法之前被自定義的isLogin攔截器攔截下來進入到IsLoginInterceptor類來進行登陸驗證。
IsLoginInterceptor.java:
public class IsLoginInterceptor extends AbstractInterceptor {
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
//獲得Session對象
Map session = invocation.getInvocationContext().getSession();
//判斷session中是否有信息
if(session.get("userid") == null)
{
//無信息返回配置文件中<global-results>配置的全局頁面
return Action.LOGIN;
}
else
{
//有信息繼續(xù)執(zhí)行execute()方法
return invocation.invoke();
}
}
}
注:defaultStack是每個<action/>默認的攔截器棧。然而當用戶在<action>中放入了自定義的攔截器的時候,就必須再顯式的放入defaultStack。
struts2之所以能在Action類里能做那么多功能,就是依賴于其默認的攔截器棧里定義的各種攔截器。
用戶可以配置自己的攔截器棧作為默認的攔截器棧:
只需將配置中的注釋解開,<action/>配置里的<interceptor/>也就無需寫了。此時自定義的myStack代替了defaultStack攔截器棧
實際開發(fā)中,往往配置多個攔截器棧,配置于不同業(yè)務模塊的<action/>中。
但是注意默認的攔截器棧只能是一個。
2.方法過濾攔截器
默認情況下我們?yōu)槟硞€Action定義了攔截器,則這個攔截器會攔截該Action的所有方法。有些情況下,我們無需攔截所有的方法,此時就需要使用方法過濾攔截器。
方法過濾攔截器使用方法與普通的攔截器沒什么區(qū)別:
方法過濾攔截器類繼承MethodFilterInterceptor,
重寫的是doIntercept(ActionInvocation invacation)方法
<action/>配置中:
<!--放入上面自定義的攔截器-->
<interceptor-ref name="isLogin">
<!-- 指定login和register方法不需要被攔截-->
<param name="excludeMethods">login,register</param>
<!-- 指定execute方法需要被攔截-->
<param name="includeMethods">execute</param>
</interceptor>