Session深度解析
中文名稱會話,Http客戶端和Http伺服器開始通訊,就會產生會話,會話過程是可以連續的,也可以是時斷時續的,它會有一個時間範圍,表象就是你登入一個網站,如果長時間未登入,網站會提示你,這就是對session的一種應用。
從無到有,從有到無。
以Tomcat為例,當使用瀏覽器訪問一個jsp時,Tomcat會先根據jsp生成java檔案,再編譯成class,最後執行,輸出內容到瀏覽器,瀏覽器解析呈現給使用者。java和class檔案會放到<Tomcat安裝目錄>/work/Catalina/localhost/<你的應用>/org/apache/jsp/<相應包>下,比如你有個test.jsp,那麼就會生成test_jsp.java檔案。開啟test_jsp.java,找到其_jspService方法,會看到宣告瞭一些我們常說的jsp內建物件。
PageContext pageContext = null; HttpSession session = null; ServletContext application = null; JspWriter out = null;
再往下看,會看到有一句session = pageContext.getSession();,這裡生成了session物件,也就是說,訪問jsp時,伺服器自動生成了session物件(可以在jsp的page宣告中加入session="false",禁用session)。
啟動一個應用,訪問一個jsp,這裡以我本地的為例。
初次訪問伺服器上的一個jsp,伺服器在響應頭中設定了臨時cookie,並加上了一JSESSIONID(毋庸置疑,肯定是伺服器給加上的,Tomcat具體程式碼我沒有去找)。
第二次訪問jsp:
瀏覽器將儲存JSESSIONID的cookie隨著請求一起傳送到伺服器,伺服器通過JSESSIONID到記憶體中找到上次生成的session物件,從而實現客戶端(瀏覽器)共享session。JSESSIONID也可以拼在url上,如http:///localhost:8080/testApp/test.jsp;JSESSIONID=XXXXXXXXXXXX?param1=value1,JSESSIONID可以通過request.getSession().getId()得到,url中如果有JSESSIONID,伺服器就不會從cookie中取了。
注:瀏覽器多個tab之間(同一域下)共享session,實際上就是臨時cookie都一樣,JSESSIONID都是一個。而多個視窗之間使用不同的cookie不一樣,所以不能共享session。
2.1. session在伺服器建立後,什麼時候會消失呢?
-
伺服器被強制關閉,肯定啥都沒有了,這要看伺服器具體的實現,像Tomcat正常關閉(使用shutdown,而不是X掉)的話,是會對session序列化到硬碟上的,重新啟動後,會讀取,原有的session依然存在。
-
程式中呼叫session.invalidate(),銷燬當前session方法。
-
session超時,超時指的是伺服器連續一段時間內(超出了應用中設定的最低時限)沒有接收到session所在客戶端的請求,伺服器從記憶體中移除該session物件。
2.2. 瀏覽器視窗關閉,session會消失嗎?
老師通常這麼告訴,很多書中也這樣講,真是偷換概念,大錯特錯,瀏覽器關閉後,只是對應伺服器session的JSESSIONID消失了,而伺服器再也用不到這個session,導致超時,伺服器會自動銷燬。
注:本文中討論的session只是儲存在伺服器記憶體的情況,諸如其它放在Cache中、分散式儲存、持久化神馬的,還沒接觸,也就沒研究。
- session是消耗伺服器記憶體的,所以要合理使用session,別什麼東西都往session裡放。
- session是由伺服器建立的,跟瀏覽器沒有半毛錢關係,瀏覽器只是拿到一個JSESSIONID。
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/13023425
相關文章
- flask 原始碼解析:sessionFlask原始碼Session
- 深度解析HashMapHashMap
- 深度解析CNNCNN
- 深度解析Hashtable
- Spring Session原理解析SpringSession
- Flutter原理深度解析Flutter
- CAS原理深度解析
- 深度解析跨域跨域
- Kafka深度解析(1)Kafka
- Spark深度解析(2)Spark
- OkHttp原始碼深度解析HTTP原始碼
- SnapHelper原始碼深度解析原始碼
- Vuex 原始碼深度解析Vue原始碼
- 深度解析單例模式單例模式
- CSS 繼承深度解析CSS繼承
- 微信小程式深度解析微信小程式
- Java ThreadLocal深度解析Javathread
- Android Fragment 深度解析AndroidFragment
- HashMap和HashSet深度解析HashMap
- VueRouter 原始碼深度解析Vue原始碼
- Laravel核心解讀–Session原始碼解析LaravelSession原始碼
- 非正式全面解析 NebulaGraph 中 Session 管理Session
- go的markdown解析庫和session庫GoSession
- 跟蹤SESSION 與 trace 檔案解析Session
- 基於深度學習的網路表示 [session]深度學習Session
- Google Play 家庭政策深度解析Go
- 深度解析戰鬥通行證
- React Hooks原始碼深度解析ReactHook原始碼
- 深度解析阿里的PayWatch阿里
- 深度解析JAVA序列化Java
- 深度解析:清理爛程式碼
- 模板方法模式深度解析(三)模式
- 模板方法模式深度解析(二)模式
- 模板方法模式深度解析(一)模式
- java單例模式深度解析Java單例模式
- Docker網路模型深度解析Docker模型
- 深度解析@angular/platform-browser-dynamicAngularPlatform
- RecyclerView用法和原始碼深度解析View原始碼