Session深度解析

他山之石頭發表於2013-10-25

第 1 章 簡介

1. 廣義的session

       中文名稱會話,Http客戶端和Http伺服器開始通訊,就會產生會話,會話過程是可以連續的,也可以是時斷時續的,它會有一個時間範圍,表象就是你登入一個網站,如果長時間未登入,網站會提示你,這就是對session的一種應用。

2. JavaEE中的session

       JavaEE規範中,session被定義為一個具體的介面,javax.servlet.http.HttpSession,這個介面最終由符合JavaEE規範的應用伺服器來實現,如我們最常用的Tomcat、Weblogic、Websphere等,session通常是儲存在伺服器記憶體中的(也有其它儲存方式,但這裡只討論這種情況),也就是說session是伺服器建立的,而不是瀏覽器建立的(剛開始學習時,老師經常這麼說,可能也是為了方便理解)。

第 2 章 生命週期

       從無到有,從有到無。

1. session的建立

1.1. 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)。

1.2. 伺服器生成session後,瀏覽器下次訪問,伺服器怎麼判斷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. session的銷燬

2.1. session在伺服器建立後,什麼時候會消失呢?

  • 伺服器被強制關閉,肯定啥都沒有了,這要看伺服器具體的實現,像Tomcat正常關閉(使用shutdown,而不是X掉)的話,是會對session序列化到硬碟上的,重新啟動後,會讀取,原有的session依然存在。

  • 程式中呼叫session.invalidate(),銷燬當前session方法。

  • session超時,超時指的是伺服器連續一段時間內(超出了應用中設定的最低時限)沒有接收到session所在客戶端的請求,伺服器從記憶體中移除該session物件。

2.2. 瀏覽器視窗關閉,session會消失嗎?

       老師通常這麼告訴,很多書中也這樣講,真是偷換概念,大錯特錯,瀏覽器關閉後,只是對應伺服器session的JSESSIONID消失了,而伺服器再也用不到這個session,導致超時,伺服器會自動銷燬。

       注:本文中討論的session只是儲存在伺服器記憶體的情況,諸如其它放在Cache中、分散式儲存、持久化神馬的,還沒接觸,也就沒研究。

第 3 章 總結

  • session是消耗伺服器記憶體的,所以要合理使用session,別什麼東西都往session裡放。
  • session是由伺服器建立的,跟瀏覽器沒有半毛錢關係,瀏覽器只是拿到一個JSESSIONID。

       本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/13023425

相關文章