2012-02-10 63 views
0

我開發了一個應用程序,其中託管的bean有ViewScopedSessionScoped。所有需要用戶登錄的模塊,託管的豆將在SessionScoped,非登錄頁面將在ViewScoped。目前,問題在於,當會話超時時間超過30分鐘後默認情況下,非登錄頁面的表現異常,其中commandButton不向服務器發送請求,而且它也發生在所有具有ajax行爲的按鈕上頁。a4j在jsf和管理bean會話超時後無法工作viewscoped

我也想知道爲什麼頁面表現得像那樣沒有會話。是否因爲ViewScoped創建臨時會話來保存頁面,只要用戶沒有導航到其他頁面?

我已經嘗試了大部分給出的建議。

+0

當您說「a4j」是指RichFaces的「」組件? – BalusC 2012-02-10 13:26:53

+0

@BalusC >>是的。 – user1201055 2012-02-13 03:28:01

回答

1

摘自BalusC's Communication in JSF 2.0

•@ ViewScoped:在這個範圍豆住,只要你在瀏覽器窗口/標籤相同的JSF視圖交互。它會在HTTP請求中創建,並在您回發到其他視圖後被破壞。當您通過GET請求離開/關閉視圖時,它不會立即被破壞,但它不再以通常的方式訪問。 JSF將bean以受管bean名稱作爲關鍵字存儲在UIViewRoot#getViewMap()中,該關鍵字又存儲在會話中。您需要從操作(偵聽器)方法返回null或void以保持bean活着。使用此作用域可以使用更復雜的表單,這些表單使用ajax,數據表和/或多個呈現/禁用屬性,其狀態需要在同一瀏覽器窗口/選項卡(視圖)內的後續請求中保留。

•@ SessionScoped:只要HTTP會話存在,此範圍內的bean就會一直存在。它在會話中涉及此Bean的第一個HTTP請求時創建,並在HTTP會話失效時(或者從會話映射中手動刪除Bean)被破壞。 JSF將bean作爲HttpSession的一個屬性進行存儲,並將託管的bean名稱作爲關鍵字。它也可以通過ExternalContext#getSessionMap()獲得。使用此作用域可以在同一會話中的所有瀏覽器窗口/選項卡(視圖)之間安全地共享純會話範圍的數據。例如,登錄用戶,所述用戶偏好例如用戶特定的設置和所選擇的語言/區域設置等

ViewScoped豆被存儲在其又被存儲在用戶會話中的UIViewRoot,因此ViewScoped bean也間接存儲在會話中。會話過期並被銷燬後,ViewScoped bean也會被銷燬,如果您在該代碼中引用期望狀態的代碼中的某些內容,或者您​​正在使用需要狀態(如.a4j)的第三方組件,那麼這可以解釋這個奇怪的問題。

我建議切換到RequestScoped爲您的LoginBean。我從來沒有遇到過需要ViewScoped支持bean登錄到應用程序的情況。

+0

>> ViewScoped不適用於LoginBean。有一個用戶不需要登錄的頁面。它就像一個搜索頁面,裏面有很多Ajax行爲。這就是爲什麼我使用ViewScoped的原因。根據您的解釋,'ViewScoped bean間接也存儲在會話中。會話過期並被銷燬後,ViewScoped bean也會被銷燬。目前,我所做的是操縱JavaScript中的會話計數,我認爲這不是強制用戶在30分鐘後重新加載頁面的最佳解決方案。 – user1201055 2012-02-13 03:34:11