Struts2核心攔截器
當(dāng)struts2經(jīng)過輸入校驗(yàn)階段(struts2系列---輸入校驗(yàn))后,接著將調(diào)用execute()業(yè)務(wù)邏輯方法。有時(shí)我們需要在執(zhí)行execute()方法之前先進(jìn)行比如登陸驗(yàn)證之類的判斷。只有登陸過的用戶才能進(jìn)行業(yè)務(wù)操作。這時(shí)就需要用到Struts2的攔截器Interceptor。
以下為struts2攔截器用法的簡(jiǎn)單小結(jié):
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>
-->
<!--定義全局跳轉(zhuǎn)頁(yè)-->
<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默認(rèn)的攔截器棧-->
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
當(dāng)執(zhí)行execute()方法之前被自定義的isLogin攔截器攔截下來進(jìn)入到IsLoginInterceptor類來進(jìn)行登陸驗(yàn)證。
IsLoginInterceptor.java:
public class IsLoginInterceptor extends AbstractInterceptor {
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
//獲得Session對(duì)象
Map session = invocation.getInvocationContext().getSession();
//判斷session中是否有信息
if(session.get("userid") == null)
{
//無信息返回配置文件中<global-results>配置的全局頁(yè)面
return Action.LOGIN;
}
else
{
//有信息繼續(xù)執(zhí)行execute()方法
return invocation.invoke();
}
}
}
注:defaultStack是每個(gè)<action/>默認(rèn)的攔截器棧。然而當(dāng)用戶在<action>中放入了自定義的攔截器的時(shí)候,就必須再顯式的放入defaultStack。
struts2之所以能在Action類里能做那么多功能,就是依賴于其默認(rèn)的攔截器棧里定義的各種攔截器。
用戶可以配置自己的攔截器棧作為默認(rèn)的攔截器棧:
只需將配置中的注釋解開,<action/>配置里的<interceptor/>也就無需寫了。此時(shí)自定義的myStack代替了defaultStack攔截器棧
實(shí)際開發(fā)中,往往配置多個(gè)攔截器棧,配置于不同業(yè)務(wù)模塊的<action/>中。
但是注意默認(rèn)的攔截器棧只能是一個(gè)。
2.方法過濾攔截器
默認(rèn)情況下我們?yōu)槟硞€(gè)Action定義了攔截器,則這個(gè)攔截器會(huì)攔截該Action的所有方法。有些情況下,我們無需攔截所有的方法,此時(shí)就需要使用方法過濾攔截器。
方法過濾攔截器使用方法與普通的攔截器沒什么區(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>
posted on 2009-03-05 10:35 §朱家二少§ 閱讀(434) 評(píng)論(0) 編輯 收藏 所屬分類: Struts2