2008-10-23 76 views
4

好的簡單問題。我有一個JSF應用程序,包含一個登錄頁面。問題是如果用戶加載登錄頁面,離開它一段時間,然後嘗試登錄會話過期,並引發ViewExpiredException。發生這種情況時,我可以重定向到登錄名,但這不是很順利。我怎樣才能讓這個流程在沒有額外嘗試的情況下正確登錄?jsf登錄超時

回答

6

更新

由於鑽嘴魚科的2.1.19/2.2.0您現在可以設置<f:view>的瞬態屬性爲true:

<f:view transient="true"> 
    Your regular content 
</f:view> 

你可以閱讀有關在Balusc's博客在這裏:

http://balusc.blogspot.com.br/2013/02/stateless-jsf.html

原始

如果您使用的Facelets,你可以創建自己的ViewHandler來處理這個問題:

public class LoginViewHandler extends FaceletViewHandler 
{ 
    public LoginViewHandler(ViewHandler viewHandler) 
    { 
     super(viewHandler); 
    } 

    @Override 
    public UIViewRoot restoreView(FacesContext ctx, String viewId) 
    { 
     UIViewRoot viewRoot = super.restoreView(ctx, viewId); 

     if (viewRoot == null && viewId.equals("/login.xhtml")) 
     { 
      // Work around Facelet issue 
      initialize(ctx); 

      viewRoot = super.createView(ctx, viewId); 
      ctx.setViewRoot(viewRoot); 

      try 
      { 
       buildView(ctx, viewRoot); 
      } 
      catch (IOException e) 
      { 
       log.log(Level.SEVERE, "Error building view", e); 
      } 
     } 

     return viewRoot; 
    } 
} 

更改「/login.xhtml」你的登錄頁面。這將檢查它是否可以恢復您的視圖,如果它不能,並且當前視圖是您的登錄頁面,它將爲您創建並構建視圖。

設置這在你的臉上-config.xml中如下:

<application> 
    <!-- snip --> 
    <view-handler>my.package.LoginViewHandler</view-handler> 
</application> 

如果你使用無Facelets的(即JSP)的JSF你可以嘗試具有類擴展ViewHandlerWrapper - 注意,buildView()將不可用。希望自己創建View()可以正確設置視圖,但我並不完全確定使用JSF/JSP。

+0

任何想法如何在JSF 2中做到這一點? – 2012-08-22 00:49:56

0

夫婦略哈克解決方案:

  • (非常哈克)使用<meta http-equiv="refresh" content="5"/>標籤每隔一段時間自動重新加載頁面。
  • 使用JavaScript函數定期向服務器發送「ping」請求,以保持會話活動。

我們在工作中使用IceFaces,它會自動檢測您的會話何時到期,並顯示一個彈出窗口,提醒您注意事實。但由於某些原因,我們仍然在登錄頁面上遇到問題。

0

這聽起來像您的登錄頁面在會話範圍內,當它真的不需要。請求範圍對於登錄頁面應該沒問題(因爲在用戶登錄之前,實際上應該沒有會話中的任何內容)。一旦用戶登錄,您可能會收回此問題,但從此Phill的想法非常好。

0

使用jsp,您可以禁用該頁面的會話,包括此指令<%@ page session="false" %>。 jsf必須有類似的東西。