[英]Session in java - Any best practises?
我遇到了一個代碼,其中以兩種不同的方式(或者以兩種不同的方式編寫)獲取了會話對象。
使用HttpServletRequest
someMethod(HttpServletRequest request){
HttpSession session = request.getSession();
//getAttribute from session
}
並使用HttpSession
anotherMethod(HttpSession session){
//getAttribute from session
}
我瀏覽了這篇文章 ,並對SO 提出了一個問題 。 但是我仍然有一些疑問。
有人可以幫助我了解兩者之間的區別嗎?
更新
這兩個都是spring控制器中的方法,它們被映射到不同的ajax調用。 我知道每個請求對象都有一個會話,但是當您傳遞HttpSession對象時,它將在哪里找到當前會話對象(加載所有屬性)或如何獲取? 當我從javascript調用方法時,我什么都不傳遞。
someMethod(HttpServletRequest request)
在此過程中,您傳遞了當前request
對象,可以從中獲取current session
,然后從中獲取屬性。您可以使用以下命令從請求對象中獲取當前會話對象:
request.getSession(false)
*注意:-我們將false
作為參數傳遞給getSession(false)
以獲取任何現有會話。如果不存在任何會話,它將返回null
..而request.getSession()
將始終創建一個新會話,因此您不會無法在其他會話中獲取任何prevoius屬性存儲。
anotherMethod(HttpSession session)
在這里,您是從某個地方傳遞session
對象本身的。。可能是因為,您的session
對象包含許多屬性,並且您不想在該方法中使用許多參數。
但是您應該在Servlet
完成所有與session
相關的任務,並將attribute
傳遞給其他類的方法。
如果您具有單個屬性,則無需浮動會話對象。 只需使用會話對象即可訪問它。
HttpSession session = request.getSession(true);
session.getAttribute(name);
現在,您可以浮動session
對象的唯一明智的情況是,您擁有大量的屬性,並且希望每種方法都可以訪問其自己的屬性集。 無論如何,該方法取決於傳遞給它的session
,因此它不必關心如何獲得它。
兩者之間沒有太大的區別,如果多次調用可以通過將會話保持為類似於本地緩存的方式來消除一個額外的方法調用request.getSession()
,則可以使用第二種方法(除非調用了100次,否則性能會明顯提高) 。
例如,。
HttpSession session=request.getSession();
getFirstAttr(session);
getSecondAttr(session);
....
getHundredthAttr(session);
如果您使用第一種方法,則始終將該方法稱為一個額外的request.getSession()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.