十四、Session底層的實現原理、Session對象的銷毀、application與session、request的范圍大小


1、關於web編程中的Session;
1)什么是會話:
 "目前"可以這樣理解:用戶打開瀏覽器,在瀏覽器上面發送多次請求,知道最終關閉瀏覽器,表示一次完整的會話。
在會話進行過程中,web服務器一直為當前這個用戶維護着一個會話對象httpSessio
HttpSession 對象是一個會話級別的對象,一次會話對應一個HttpSession對象
Session表示會話,不止是在javaweb中存在,只要是web開發,都會有會話這種機制;
Cookie可以將回話狀態保存在客戶端,HttpSession可以將回話狀態保存在服務器端。
備注:如果Cookie不設置有效期的話,被默認保存在瀏覽器緩存當中;當瀏覽器關閉的時候這個Cookie就沒有了。

2)什么是一次會話?
 一般多數情況下,是這樣描述的:用戶打開瀏覽器,在瀏覽器上進行一些操作,然后將瀏覽器關閉,表示一次會話結束
本質上的描述:從session對象的創建,到最終session對象超時之后銷毀,這個才是真正意義上的一次完整會話。 

3)session底層的實現原理:
A、瀏覽器:
  在瀏覽器上發送首次請求給服務器;
B、服務器:
  服務器會創建一個HttpSession對象,該對象代表一次會話;
  同時生成HttpSession對象,對應的Cookie對象,並且Cookie對象的name名字是JSESSIONID,Cookie的value是32位長度的字符串
  服務器將Cookie的vaule和HttpSession對象綁定到session列表中
  服務器將Cookie完整發送給瀏覽器客戶端
C、瀏覽器:
  瀏覽器客戶端將Cookie保存到緩存中
備注:只要瀏覽器不關閉,Cookie不會消失(瀏覽器關閉的話,session對象是不銷毀的,因為服務器和瀏覽器之間是基於http協議的,
http協議是一種無連接協議,或者說是無狀態協議,因此不知道瀏覽器關了)
D、瀏覽器:
  當再次發送請求的時候,會自動提交緩存當中的Cookie。服務器接收到Cookie,驗證Cookie的name(JSESSIONID)然后獲取該Cookie的value
  通過Cookie的value去session列表中檢索到對應的HttpSession對象。


2、瀏覽器禁用Cookie會出現什么問題?怎么解決?
1)瀏覽器禁用Cookie,則瀏覽器緩存中不再保存Cookie,導致在同一個會話中,無法獲取到對應的會話對象。
2)禁用Cookie之后,每一次獲取的會話對象都是新的。在瀏覽器中禁用Cookie之后很多web站點你是無法訪問的。
備注:瀏覽器禁用Cookie之后,若還向拿到對應的Session對象,必須使用URL重寫機制,怎么重寫URL?
http://localhost/prj-servlet23/user/accessMySelfSession;jsessionid=D3E995BC5FD3B0518BF2966863E94D3E995BC5FD3B0518BF2966863E94
改值是通過httpwatch監聽到的;
重寫URL會給編程帶來難度/復雜度,所以一般的web站點是不建議禁用Cookie的,建議瀏覽器開啟cookie
  
3、瀏覽器關閉之后,服務器對應的session對象會被銷毀嗎?為什么?
1)瀏覽器關閉之后,服務器不會銷毀session對象,因為B/S架構的系統基於HTTP協議,而HTTP協議是一種無連接/無狀態的協議
2)什么是無連接/無狀態的協議?
 請求的瞬間瀏覽器和服務器之間的通道是打開的,請求響應結束之后,通道關閉.這樣做的目的是降低服務器的壓力。
 
4、session對象在什么時候被銷毀?
 web系統中引入了session超時的概念。
 當很長一段時間(這個時間可以配置)沒有用戶再訪問session對象,此時session對象超時,web服務器自動回收session對象
 可配置:在web.xml文件中,默認是30分鍾,實際開發過程中一般都配置成2個小時,表示2個小時之內沒有人再訪問就銷毀該session對象;
 <session-config>
   <session-timeout>120</session-timeout>
 </session-config>

5、關於javax.servlet.http.HttpSession接口中常用的方法:
 void setAttribute(String name,Object value)
 Object getAttribute(String name)
 void removeAttribute(String name)
 void invalidate() 銷毀Session

6、ServletContext、HttpSession、HttpServletRequest接口的對比:
 ServletContext application;是應用范圍
 HttpSession session;是會話范圍
 HttpServletRequest request;是請求范圍 
 
 備注:三個范圍的排序:application>session>request
 application完成跨會話共享數據
 session完成跨請求共享數據,但是這些請求必須在統一個會當中
 request完成跨servlet共享數據,但是這些Servlet必須在統一個請求當中【轉發】
 
 使用原則:由小到大嘗試
   越小越好,越小耗費的資源越小,優先使用小范圍;
   例如向跨請求傳遞數據的話:
   ServletContext:可以完成跨請求共享數據,不是說不安全,是所有用戶共享的。
   HttpSession:是一個用戶一個,
   HttpServletRequest:一次請求一個。
   例如:登錄成功之后,已經登錄成功的狀態需要保存起來,可以將登錄成功的這個狀態保存到session對象中
    登錄成功狀態不能保存到request范圍中,因為一次請求對應一個新的request對象
    登錄成功的狀態也不能保存到application范圍中,因為登錄成功狀態是屬於會話級別的,不能所有用戶共享 
 備注:只要會話不關session永遠之后一個,session中保存的數據你永遠都能訪問。只要你瀏覽器不關,你一直都能夠訪問。
 當你的瀏覽器關閉之后,你的session會話會超時,超時之后會自動銷毀,銷毀之后下次再訪問就必須登錄了。因為你的Session
 里面沒有東西。
7、HttpServletRequest中的方法:
 HTTPSession session=request.getSession();獲取當前的session,獲取不到,則新建session
 HttpSession session=request.getSession(true);獲取當前的session,獲取不到則,新建Session
 HTTPSession session=request.getSession(false);獲取當前的session,獲取不到,則返回null;
  
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM