標籤:
前面已經轉載過一份關於Struts2攔截器的詳細分析,這裡就不寫的那麼清楚了,簡單的寫一個Struts2 對session的攔截器。
首先 明確一下我們的頁面流程:
userLogout.action 當我們執行這個操作的時候,應該進入退出介面。
http://localhost:8080/OA/userLogout.action
問題在於,如果我們沒有登入,或者說session到期了。我們還能進入這個頁面嗎?顯然是不應該進入的,應該跳轉到登入介面。如果是一個action我們可以在action裡面進行對session的擷取和相應參數的判斷,但是多個action都重複這一個過程就有些臃腫了,我們可以用struts2的攔截器來實現這個過程。
1:我們先定義一個攔截器:
我們看到的ActionContext以及Map類型的session,只是Struts2擷取servlet支援的一種方式,還可以用繼承Aware介面的方式。這個就不再深究了。invocation的invoke方法是有攔截器就接著往下執行,沒有就執行真正的action。最後return Action.LOGIN就跟我們經常用的return SUCCESS一樣,都是父類給定義好的,我們直接用而已。
package com.oa.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/** * * @author: zhao * @time: 2016年5月3日 * * @description:Struts2攔截器,判斷目前使用者是否線上,即在session中是否有記錄,session預設不工作十分鐘便銷毀 */public class SessionInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext context=invocation.getInvocationContext(); Map<String, Object> session=context.getSession(); String id=(String) session.get("id"); if(id!=null&&!"".equals(id)){ return invocation.invoke(); } return Action.LOGIN; }}
2:struts.xml
我們定義了把自己寫好的攔截器類在下面定義好了,名字是sessionInterceptor,又定義了一個攔截器棧,把我們的自己寫的攔截器和系統預設的攔截器都寫在了一起。這是因為當我們使用了自訂攔截器時,預設攔截器就不起作用了,所以必須必須把預設攔截器顯式的寫在下面。
<package name="default" extends="struts-default"> <interceptors> <interceptor name="sessionInterceptor" class="com.oa.interceptor.SessionInterceptor"></interceptor> <interceptor-stack name="systemStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="sessionInterceptor"/> </interceptor-stack> </interceptors> </package>
3:strtus_system.xml
我把這個檔案的內容進行了刪減,留下來最直觀的東西。有一個全域的結果,name是login,這個和上面自訂攔截器中的Action.Login是對應的。現在我們的userLogoutAction用的是預設的攔截器棧,所以才會出現最上面那種直接進入退出介面的結果,這顯然是不對的。
<package name="system" extends="default"> <global-results> <result name="login">/WEB-INF/content/home.jsp</result> </global-results> <action name="userLogout" class="com.oa.action.UserLogoutAction"> <interceptor-ref name="defaultStack" /> <result>/WEB-INF/content/exit.jsp</result> </action> </package>
4:修改struts_system.xml
把攔截器引用改成我們寫好的攔截器棧就好了,這個攔截器棧中有預設的攔截器,所以不用擔心別的介面不能中英文切換的問題。現在再執行一次看看效果
<action name="userLogout" class="com.oa.action.UserLogoutAction"> <interceptor-ref name="systemStack" /> <result>/WEB-INF/content/exit.jsp</result> </action>
Struts2自訂攔截器