2014-02-08 28 views
0

我正在使用Myfaces 2.2和客戶端狀態保存。我發現存儲在viewmap中的ViewScoped beans &在用戶會話銷燬後會丟失。 我知道,不知道它是否正確,這是預期的行爲,但在會話銷燬後避免查看過期例外的方法是什麼?如何在會話銷燬後使用viewscoped beans/viewmap(使用客戶端保存)?

我的問題是,我非常快速地摧毀了用戶會話後,一些不活動期(如20分鐘後),但我希望即使在那之後(當使用客戶端保存時)viewcope數據仍然存活,以便當用戶回來後會話銷燬,他不需要刷新頁面。我不知道爲什麼&這是如何實現的,但用戶可能正忙於閱讀網站的某些部分或離開20分鐘,&,因爲他回來&與打開的頁面進行交互是非常正常的,我將如何做到這一點沒有國家? 我認爲這是任何公共網站的共同要求。

我認爲如果我使用客戶端狀態保存(因爲我的頁面仍然有效),內部使用的jsf viewstate不會丟失,但那麼爲什麼那些viewscoped bean的作用域也被序列化爲頁面以及viewstate。

如果這是設計的行爲,有沒有什麼辦法可以使視圖範圍數據在會話過期後仍然存在?

+0

查看範圍比會話範圍的範圍更窄。它不應該在會話超時後存活,如果存在,它會導致巨大的差異,具體取決於您是否保存了客戶端或服務器狀態。 – Kayaman

+1

視圖範圍依賴於會話範圍(bean存儲在會話的上下文中),因此銷燬會話也會擺脫它內部的bean – kolossus

+0

那麼在會話銷燬後如何避免查看過期的異常呢?我只將用戶會話保留在服務器上20分鐘,但用戶可能正在忙於閱讀網站的某個部分或離開20分鐘是非常正常的事情,並且當他回來並與打開的頁面交互時,我將如何恢復查看狀態?這在任何網站都是非常正常的情況。其他JSF網站如何處理這個問題?總之,我希望能夠在用戶回覆並與舊頁面交互時對用戶做出響應,我如何設計它? –

回答

0

的回答,我從MyFaces的用戶郵件列表有:

viewRoot.getAttributes()地圖可以用來保留會話銷燬即使在viewscoped值。因此,不是將值存儲到viewRoot.getViewMap(),而是存儲在由viewRoot.getAttributes()返回的映射中。但是應該注意確保存儲的值是可序列化的。