2014-01-15 198 views
0

爲了避免在登錄頁面和ViewExpiredException會話超時,我切換設置狀態使用保存到客戶端:註銷重定向用戶到登錄頁面後再次用戶嘗試再次登錄時,會話超時

<context-param> 
     <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
     <param-value>client</param-value> 
 </context-param> 

我注意到,

ERROR [org.apache.catalina.connector.CoyoteAdapter] An exception or 
    error occurred in the container during the request processing                         
    java.lang.ArrayIndexOutOfBoundsException 
ERROR [org.apache.coyote.http11.Http11Processor] Error finishing response 
    java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native Method) 

,用戶的主頁重定向:當會話超時,我試圖再次登錄,除非我得到這個錯誤,我會被重定向到我參觀的最後一頁。我還沒弄明白,但我認爲現在可以。 我現在的問題是當用戶在會話超時時單擊註銷鏈接並嘗試再次登錄時,他將被重定向到登錄頁面。我的觀察是因爲它沒有遇到上述錯誤,它繼續執行註銷鏈接應執行的操作,即執行Identity.logout()並將用戶重定向到登錄頁面。我認爲導致重定向登錄頁面的人是pages.xml中的這一行。

<navigation from-action="#{identity.logout}"> 
     <end-conversation before-redirect="true" /> 
     <redirect view-id="/identifier.xhtml" /> 
</navigation> 

但刪除行並沒有解決問題。可能的解決方案是:

  1. 被執行扣除註銷時會話超時,用戶試圖在會話超時,用戶嘗試再次登錄,並引導用戶登錄再次

  2. 停止持續的每一個方法主頁,而不是隻喜歡新鮮的登錄(我認爲這也將防止Http11ProcessorArrayIndexOutOfBoundsException

什麼你可以建議在實施此解決方案的最佳途徑?我使用jboss-soa 4.3.0jsf 1.1

回答

0

我設法做我的解決方案2通過在components.xml中刪除這些行:

<event type="org.jboss.seam.security.notLoggedIn"> 
     <action execute="#{redirect.captureCurrentView}"/> 
     <action execute="#{identity.tryLogin}"/>  
     </event> 
    <event type="org.jboss.seam.security.loginSuccessful"> 
     <action execute="#{redirect.returnToCapturedView}"/> 
    </event> 

現在每次會話過期並且用戶嘗試登錄時,他將被重定向到主頁。這足以解決我的註銷問題,現在除去ArrayIndexOutOfBoundsException,除非他們想恢復用戶訪問的最後一頁。

0

這是我在我的項目像你這樣的解決方案。它使用Servlet Filter

假設=>登錄過程後,用戶對象可能會保持與ID「loginUser」的會話。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; 
    HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; 
    HttpSession session = httpRequest.getSession(); 
    User user = (User) session.getAttribute("loginUser"); 
    if (user != null) { 
     filterChain.doFilter(servletRequest, servletResponse); 
    } else { 
     httpResponse.sendRedirect(httpRequest.getContextPath() + "/login.xhtml"); 
    } 
} 
相關問題