2010-05-19 39 views
2

對於我得到的每個servlet請求,我可能會傳遞10個方法,然後我需要在會話中檢查某些內容,並且需要HttpSession。我如何跟蹤每個servlet請求的會話,直到我使用它?單身人士不會工作?

我可以得到HttpSession的唯一方法是從HttpServletRequest,是否正確?

如何跟蹤每個servlet請求的會話?不幸的是,我不能簡單地做一個單例(例如,SessionInformation.instance()。getAttribute(「name」)),因爲該會話將被用於所有請求。

是否有辦法爲每個請求全局存儲會話,而不必將所有方法都傳遞給它(或它的信息),以防萬一需要時?

更新1:

Alohci把我推到正確的方向。我需要的東西可以是:

1)管理僅通過線程全局存儲變量。一個「單線程每線程」解決方案?

2)或者每個線程/ servlet獲取的請求是否存在唯一的ID?如果是這樣,什麼?

+0

說實話。正確的方法是傳遞信息。你的應用程序不應該太複雜,以至於不得不將這些信息發送到下一個方法。 謝謝大家。 – corgrath 2010-05-20 19:14:38

回答

6

如何跟蹤每個servlet請求的會話 ?

服務器通過在瀏覽器上保存會話ID的cookie標記用戶來識別用戶。在服務器上,會話是您放置數據的位置,您需要在客戶端/服務器交互期間跟蹤數據(嚮應用程序提供狀態)。

session.setAttribute("name", SerializableObject) 

注:因爲在數據存儲和內存緩存應用程序引擎存儲會話數據,存儲在會話中的所有值必須實現java.io.Serializable接口。

然後,您可以通過做

request.getSession() 

搶會話出的HttpServletRequest的看到的Javadoc:here

後您找回您的servlet的內部會議上,你用session.getAttribute("name")檢索任何數據你有興趣跟蹤相互作用。

有沒有在全球範圍內存儲會話的每個請求

爲什麼存儲它在全球範圍時具有ID訪問會話的唯一的事情就是有一個請求,該servlet的方式,帶有該會話ID。並非您應用程序中的所有內容都需要了解每個請求。

這裏是一個要求,與一個會話ID cookie的例子:

GET /something.htm HTTP/1.1  
Accept: www/source  
Accept: text/html  
Cookie: sessid=123456789 

你不能在全球存儲這些信息,它是唯一的每個請求。

而不必通過它

當與數據做有用的東西,不通過會話的方式,傳遞有用的信息,如用戶名,購物車等內容

HttpSession session = request.getSession() //inside a servlet 
String userName = session.getAttribute("name"); 
List<ShoppingItems> items= session.getAttribute("cart"); 

MakeTheUserPay(userName, items) //no session passing here 

您的業務邏輯方法甚至不應該知道會話是什麼。這更像是一種人造物。

+0

您寫道:「並非應用程序中的所有內容都需要了解每個請求。」 - 如果我開始在每種方法中傳遞數據,情況到底如何。我想要的是使用類似「SessionInformation.instance()。getAttribute(」name「))」,每當我需要從會話中獲取名稱。我不想閱讀並將名稱發送到「可能」使用它的每個「頁面」。 – corgrath 2010-05-20 05:53:05

+0

「如果我開始傳遞每種方法中的數據,那麼究竟會發生什麼。如果我開始在每種方法中傳遞數據,那究竟會發生什麼。」 ---你不會將它傳遞到不會被使用的地方。 「我不想閱讀並將名稱發送到」可能「使用它的每個」頁面「。」 ---將對象傳遞給需要它的代碼部分。 這樣做有什麼問題? – bakkal 2010-05-20 06:13:16

+0

對我個人而言,我總是試着去做一些通用的事情。例如,我的網站具有「頁面」(一個實現接口頁面的類),它爲每個頁面/請求執行邏輯和呈現。但是並不是所有的頁面都需要存儲在會話中的「用戶名」,那麼爲什麼我總是在我調用頁面時發送這些信息呢?我寧願在該特定頁面中執行「String username = SessionInformation.instance()。getUserName()」,而不是始終將其作爲方法參數發送。 – corgrath 2010-05-20 07:13:26

2

我想你想要的是一個java.lang.ThreadLocal變量。

+0

這是我想要的。我需要谷歌它,但看看它真的:) – corgrath 2010-05-20 05:59:57

+0

@corgrath在這裏看到:http://stackoverflow.com/questions/321757/threadlocal-variables-in-a-servlet – JoseK 2010-05-20 06:17:48

1

我認爲你需要使用一個​​通過您的表示層之間的狀態,業務層(我假設存在的話)。

上下文對象使您能夠封裝狀態以及跨層傳遞,而不必擔心如何將自身的狀態維持。如果你需要在這個領域獲得更多的信息,你可以參考核心J2EE模式書中的上下文對象設計模式。