2012-01-11 41 views
0

我正在爲有空閒超時情況下擁有自己會話管理系統的客戶端工作。會發生以下情況:JSF - 如何在會話超時時保存managedBean狀態?

  1. 用戶在設定的時間內保持空閒狀態。
  2. 會話超時重定向到登錄頁面
  3. 用戶輸入憑據並被重定向回到他所在的位置。

現在上述方法通過使POST請求傳遞javax.faces.ViewState到會話管理系統來處理。但是,在超時的情況下,處理和重定向請求中只需要8K的數據。但是由於我的託管bean正在保存大量數據(銀行應用程序,需要跟蹤計算!),請求的大小很高(大約20K),因爲重定向失敗。

那麼有什麼辦法可以以某種方式保存ViewState?或者更好的方法,我可以防止超時?像保持會話一樣活着?

我所有託管的bean都有一個session範圍。

編輯:只是在需要的情況下,在web.xml中的javax.faces.STATE_SAVING_METHOD的context-param設置爲client性能的目的。

EDIT:那些使用的HttpWatch流的軌跡,並發現javax.faces.ViewState佔用了18KB POST請求的大小的總的22KB。所以我的目標是縮小ViewState的大小。任何方式可以做到這一點?

+0

據我所知,您將會重定向到原始URL的所有請求參數作爲查詢字符串的URL重定向和狀態保存方法設定爲'client',而不是'server'? – BalusC 2012-01-11 15:22:14

+0

狀態保存方法是客戶端,是的。而重定向不會通過我的應用程序發生。服務器被配置爲通過發送POST請求自動重定向到URL,正如我所提到的。 – Vrushank 2012-01-11 15:25:21

+0

狀態保存與會話範圍的bean和會話超時無關。 – 2012-01-11 21:42:35

回答

1

狀態保存只保留與當前視圖關聯的數據。您的問題在於會話作用域bean丟失。我建議兩種解決問題的方法:

1)實現HttpSessionListener並在其sessionDestroyed()方法中獲取bean,將它們序列化並將它們存儲在與當前用戶關聯的數據庫行中。當用戶再次登錄時,您可以獲取bean,反序列化它們並將它們放入用戶的會話中。

2)實現ajax輪詢將在特定的時間內ping服務器,這樣會話將不會超時。您可以使用Richfaces JSF庫實現此功能,該庫具有用於ajax poll的內置JSF組件。