Struts2自訂攔截器

來源:互聯網
上載者:User

標籤:

前面已經轉載過一份關於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自訂攔截器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.