2012-10-29 52 views
2

我有一個在大多數操作之前運行的LoginInterceptor,並檢查成員是否登錄。如果是,則顯示該頁面,否則將重定向到登錄頁面。攔截器可以防止將URL參數傳遞給動作

但是我只注意到攔截器「阻塞」了所有的URL參數。基本上,如果操作前有攔截器,則此操作的URL參數不會傳遞給設置者。

這是我的攔截器:

public class LoginInterceptor extends AbstractInterceptor { 
    public String intercept(final ActionInvocation invocation) throws Exception { 
     final String REDIR = "loginRedirect"; 
     AuthenticationService auth = new AuthenticationService(); 
     if (auth.isMemberLoggedIn()) { 
      return invocation.invoke(); 
     } else { 
      return REDIR; 
     } 
    } 
} 

我懷疑invocation.invoke()調用動作,但沒有參數。

我能做些什麼呢?

UPDATE:

AuthenticationService.isMemberLoggedIn()

public boolean isMemberLoggedIn() { 
    Map<String, Object> session = ActionContext.getContext().getSession(); 
    String username = (String) session.get("username"); 
    if (username != null) { 
     return true; 
    } else { 
     return false; 
    } 
} 

struts.xml中

<package name="global" extends="struts-default"> 
    <interceptors> 
     <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" /> 
    </interceptors> 
    <global-results> 
     <result name="loginRedirect" type="redirect">/members/login</result> 
    </global-results> 
</package> 

然後,每個包延伸global和我調用它們在每個操作:

<interceptor-ref name="loginInterceptor" /> 
+1

有什麼不妥這裏。你可以分享你的'auth.isMemberLoggedIn()'代碼嗎?另外,要清楚的是,你的問題不是參數在重定向發生時沒有消失,而是在調用動作時它們消失了,是正確的? – rees

+1

這是正確的。我沒有看到需要分享'isMemberLoggedIn()'函數的內容。它工作正常。這就是如果測試通過並且'invocation.invoke()'被稱爲參數「消失」。 – Eleeist

+2

我問過查看它的內容,因爲我認爲它以某種方式訪問​​HttpServletRequest,在這種情況下,如果不正確,它可能是罪魁禍首。但是,如果你確定,那就不要包括它。但是,你可以在struts.xml中包含你的攔截器堆棧配置嗎? 「params」攔截器沒有被意外包含在堆棧中,也可能發生缺失的參數。 – rees

回答

6

如果你的攔截器堆棧不包括params攔截器,那麼這個問題就會發生。您應該配置您的堆棧的東西沿着這行:

 <interceptors> 
      <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" /> 
      <interceptor-stack name="customDefaultStack"> 
       <interceptor-ref name="i18n"/> 
       <interceptor-ref name="loginInterceptor"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="modelDriven"/> 
       <interceptor-ref name="fileUpload"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="multiselect"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> 
       </interceptor-ref> 
       <interceptor-ref name="conversionError"/> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
       <interceptor-ref name="workflow"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
      </interceptor-stack> 
     </interceptors> 

     <default-interceptor-ref name="customDefaultStack"/> 

或者,你可以擴展出的現成堆棧:

 <interceptors> 
      <interceptor name="loginInterceptor" class="community.interceptor.LoginInterceptor" /> 
      <interceptor-stack name="customDefaultStack"> 
       <interceptor-ref name="loginInterceptor"/> 
       <interceptor-ref name="defaultStack"/> 
      </interceptor-stack> 
     </interceptors> 

     <default-interceptor-ref name="customDefaultStack"/>