2016-04-28 122 views
0

我一直在使用Cookie在會話間共享非敏感數據。我想在用戶註銷事件中存儲當前會話的一些lastUsedEntity(字符串文字),以便可以在下次登錄會話時讀取/使用該實體。該實體屬於我的應用程序的會話bean。如何在下一個會話中使用從舊會話保存的數據?

我決定將這個實體提取並存儲在會話bean的@PreDestroy方法中。該方法在應用程序的會話超時中成功運行。但是存儲cookie失敗,因爲FacesContext.getCurrentInstance()@PreDestroy方法中爲空,可能是因爲JSF生命週期請求 - 響應週期完成。我嘗試緩存FacesContext.getCurrentInstance()@PostContruct我的會話bean的方法,以便我可以訪問面臨上下文緩存實例,但後來我面臨另一個問題java.lang.IllegalStateException at com.sun.faces.context.FacesContextImpl.assertNotReleased,因爲我使用FacesContext作爲我的會話作用域類的實例變量。如果我能夠在這裏獲得一些頭像或者其他更好的想法,以便堅持我的舊會話數據以便在這種情況下進一步使用,我將不勝感激。

回答

3

由於enduser處於非活動狀態,當HTTP會話在服務器端過期時,不一定需要HTTP請求。最終用戶本身是唯一可以發送HTTP請求的人。如果沒有調用FacesServlet的HTTP請求,那麼也沒有FacesContext。更不用說可以返回cookie的HTTP響應。

你最好重新考慮你的邏輯。例如。根據需要在每個請求上立即設置cookie,覆蓋前一個請求,如果需要,可以在特定路徑上和/或在cookie值中添加時間戳。根據具體的功能需求,可能會有更好的方法,因爲終端用戶可以完全控制cookie,並且絕對不應該依賴關鍵業務邏輯。如果純粹是爲了演示,它應該是好的,否則最好將它存儲在與登錄用戶相關聯的數據庫中。

+0

以前我一直在按照你說的去做,在每個頁面加載(或請求)上設置cookie。我在一個多頁面的應用程序工作。每個頁面都有自己的ID。一個頁面在註銷時重定向到登錄頁面。在每個ViewScoped頁面上登陸後,我一直在用'PostConstruct'方法中的一個名爲'lastOpenedId'的鍵設置cookie。此ID來自會話範圍的服務bean。但是我不得不改變它,因爲我的實際需求是存儲'lastExpiredId',而不是由於會話超時而必須跟蹤登出的頁面的id。 – user2918640

+1

將其存儲在數據庫中。 – BalusC

+0

這就是我一直在想的最後一招,除非我能想出一些可以在網頁框架層面完成的事情。 – user2918640