2014-02-07 26 views
0

現狀:JSF Ajax和普通重定向到登錄並回preveious頁

如果任何會話超時發生時,在FacesAjaxAwareUserFilterredirectToLogin功能。 將被執行。從那裏我可以重定向到我需要的任何頁面。我在所有情況下都獲得URI。 它的所有工作都很好,非常感謝BalusC。 :)

現在的第二部分,這使得問題

重定向到登錄並回到前一個頁面。

對於如:

第5頁 ---->登錄 ------>第5頁

我有將redirect uri附加到登錄uri並從bean中檢索值。

但問題是,我有2頁之前的用戶登錄。登錄模式選擇頁面(即;谷歌身份驗證或默認登錄)和讀取用戶名和密碼的頁面。

我怎樣才能通過兩個頁面的重定向URI

這是我用來在Ajax超時和正常會話超時重定向的代碼。使用

FacesAjaxAwareUserFilter

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { 
       res.setContentType("text/xml"); 
       res.setCharacterEncoding("UTF-8"); 
       res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + getLoginUrl()+"?redirectUrlPattern="+request.getRequestURI()); 
      } 
      else { 
       if (request.getRequestedSessionId()!=null && (!SecurityUtils.getSubject().isAuthenticated() || !request.isRequestedSessionIdValid())) { 
        response.sendRedirect(getLoginUrl()+"?redirectUrlPattern="+request.getRequestURI()); 
        return; 
       } 
       super.redirectToLogin(req, res); 
      } 

方法是在OmnifaceFullAjaxExceptionHandlerFactory

我已經使用了將值附加到URI的方法,但它無法確定會話是否過期或會話未創建(當用戶首先登錄時)。

問題代碼

if (request.getRequestedSessionId()!=null && (!SecurityUtils.getSubject().isAuthenticated() || !request.isRequestedSessionIdValid())) 

我正在尋找一種方法來確定從登錄之前創建新的會話過期的會話。

希望以更好的方式實現這一點。

一種不會在當前URI附加重定向URL的方法是最受歡迎的。

+0

也許你在BaluC有錯字,它應該是BalusC。您可以創建另外1個過濾器來防止會話過期情況。 –

+0

防止會話過期並不是我猜的好方法.. !!在我的問題處理會話超時完成。重定向現在是問題的一部分。 – Dileep

回答

0

我已經創立了一個解決方案,但我仍然沒有找到它作爲最佳解決方案。任何其他的答案是非常感謝。

步驟1

配置應用程序以檢測Ajax的超時和正常超時。 This是我是如何做到的..!

步驟2

查找URI時會話超時發生時,使用此。

FacesAjaxAwareUserFilter將爲您抓取ServletRequestServletResponse。 表格,你可以使用轉換,要HttpServletRequestHttpServletResponse

 HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response= (HttpServletResponse) res; 

request.getRequestURI()將讓你

String redirectURI=request.getRequestURI(); 

現在要將此保存到一些存儲,這樣就可以使用它重定向URI在任何你想要的地方。我發現的唯一方法是使用這個URL追加它。

res.getWriter().printf(FACES_REDIRECT_XML, request.getContextPath() + "/sessionexpired"+"?redirectUrlPattern="+request.getRequestURI()); 

response.sendRedirect("/sessionexpired"+"?redirectUrlPattern="+request.getRequestURI()); 

現在我sessionExpiry頁面Bean的頁面加載,我用這個搶通

redirectUrl=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("redirectUrlPattern"); 

現在使用JavaScript我設置的URL傳遞的值redirectUrl的值爲localStorageThis是如何將值保存到本地存儲。

這是我的sessionexpiry.xhtml頁面。

<script type="text/javascript"> 
function setRedirectURIToLocalStorage(){ 
    if(typeof(Storage)!=="undefined") 
     { 
     localStorage.redirectURI=document.getElementById("redirectUrl").value; 
     window.location.href="/login"; 
     } 
} 
</script> 
</h:head> 
<h:body id="body" onload="setRedirectURIToLocalStorage()"> 
    <f:view contentType="text/html"> 
<h:form prependId="false" > 
<h:inputHidden id="redirectUrl" value="#{sessionExpBean.redirectUrl}" /> 
<h:outputText value="Session Expired... Redirecting...!!"></h:outputText> 
</h:form> 
    </f:view> 
</h:body> 

該頁面將調用setRedirectURIToLocalStorage()功能onLoad ,然後將其設置的值到localStorage。因此,重定向 值在整個瀏覽器中都可用。您可以在任何需要的 頁面中使用它。所有你需要做的就是檢查這個變量 localStorage.redirectURI