2012-02-14 82 views
0

我有一個登錄攔截器,它檢查會話成員對象,如果它是空的重定向到登錄頁面,否則繼續行動。struts2攔截器重定向兩次到動作

每個動作塊都有這個攔截器。問題是,當你調用動作時它會觸發攔截器,如果它是真的繼續動作方法,則返回「成功」或「輸入」,然後再次擊中攔截器以重定向該選定的結果名稱。

我該如何防止兩次調用攔截器?

攔截代碼:

public String intercept(ActionInvocation actionInvocation) throws Exception { 
     HttpServletRequest request = (HttpServletRequest) actionInvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST); 
     HttpSession session = request.getSession(); 

    if (session.getAttribute("member")==null) { 

     return Action.LOGIN; 
    } else { 
     return actionInvocation.invoke(); 
    } 
} 

struts.xml的作用的看法:

<action name="actionName" class="actionClass" method="init"> 
     <interceptor-ref name="loginStack"/> 
     <result name="input">show.jsp</result> 
    </action> 
+0

沒有具體操作。攔截器很簡單實現類com.opensymphony.xwork2.interceptor.Interceptor – erhan 2012-02-14 14:27:58

+0

你能澄清你的擔憂嗎?攔截器通常被稱爲兩次,這就是攔截器堆棧的原因。您鑽取堆棧調用該操作,然後返回堆棧。如果你重定向,那麼它會再次被調用......但重定向通常是一些需要避免的事情。整個過程非常快,所以除非發生其他事情,否則不應該這樣。順便說一句,你可以說:actionInvocation.getInvocationContext()。getSession()並刪除第二行。 – Quaternion 2012-02-14 18:08:07

+0

@ Quaternion他們不是「被調用兩次」,他們被調用一次,幷包裝動作執行。我不知道爲什麼要避免重定向;那是什麼爭論? – 2012-02-14 22:53:15

回答

2

如果重定向到有,當然它的裁判一樣攔截器會被調用兩次結果。

如果向前到JSP,你在這裏展示,攔截器將再次調用。


有沒有必要爲每個動作聲明這一點 - 設置默認的攔截器堆棧。對於不需要的動作需要此堆棧(如登錄)爲該動作定義一個不包含此攔截器的攔截器引用。