1

我使用的HttpSessionBindingListener valueUnbound方法來釋放鎖(從數據庫中的條目),前會話即將到期:需要sessionUnbound中的會話變量?

@Override 

public void valueUnbound(HttpSessionBindingEvent event) { 
    String user = (String) event.getSession().getAttribute("currentUsr"); 
    removeLock(user); 
} 

當鎖被設置時,我正在設置的用戶名作爲一個會話變量。
我需要這個「用戶名」在我的刪除鎖定方法。但在的getAttribute拋出異常:

java.lang.IllegalStateException:的getAttribute:會話已經失效

我需要獲得會話變量的幫助?或者有沒有其他的方式來獲得用戶名?


不,因爲會話已失效。

雖然我想出溶液,我設置經由servlet上下文屬性在 的valueBound方法和得到它通過 event.getSession()的getServletContext()的getAttribute( 「cUser」);。。

它工作正常。謝謝您EJP


我得到了你的觀點EJP,你是對的,我使它複雜,我可以從event.getValue得到它()。 +1給你的答案,謝謝。

+0

請不要用評論的答案。謝謝。 – Kev

+0

我知道了Kev,謝謝:) – MeanMachine

回答

2

雖然,我想出解決辦法,我通過在方法的valueBound servlet上下文設置屬性和獲得它通過:event.getSession().getServletContext().getAttribute("cUser");

所以..你存儲會話範圍的數據應用範圍。你是否意識到這種方式的數據共享所有訪問者的Web應用程序?訪客X隨後將看到訪問者Y設置的屬性,該訪客Y稍後訪問了該網站。它使問題變得更糟。

無論如何,至於具體問題,正如異常消息試圖告訴你的那樣,會話在那時已經失效。有兩種方法來解決這個問題:

  1. currentUsr這是實現HttpSessionBindingListener,使您不必抓住它作爲一個獨特的會話屬性類的財產

  2. 改爲使用HttpSessionListenersessionDestroyed()方法在失效前被稱爲,所以您仍然應該可以訪問所有屬性。

+0

我實現了第一個,它工作順利。謝謝你的解釋。今天學到了新東西:)。謝謝@BalusC – MeanMachine

+0

不客氣。既然你是新來的,請不要忘記標記接受的答案,這有助於解決問題。另見http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – BalusC