web中session與序列化的問題
我的個人部落格站點:[http://blog.itcodai.com](http://blog.itcodai.com)
最近在寫網上商城專案的時候學習了一個關於session的序列化問題,過來總結一下。
眾所周知,session是伺服器端的一種會話技術,只要session沒有關閉,一個會話就會保持。這裡先引出一個問題:如果我在訪問某個頁面後,伺服器重啟了一下,但是網頁還沒關,那麼原來的session還在麼?答案是很明顯的,你都把伺服器關掉了,session肯定不是原來的session了,原來的像登入資訊等一些跟session相關的資訊肯定就沒了。但是如果我們想要伺服器重啟後,還是原來的session,那跟如何做呢?
這就涉及到了一個叫序列化(Serializable)的技術。當物件儲存到硬碟的時候,就需要實現序列化介面,序列化的功能就是添加了一個唯一的ID(類主鍵),這樣在反序列化(從硬碟載入到記憶體)的時候就可以成功找到相應的物件。另外,還要弄清楚一件事情:一般大家都覺得容器關閉後,session就銷燬了,其實不是這樣的,容器的關閉並不會導致session的銷燬。過程是這樣子的,一旦容器關閉後,session就會被持久化到硬碟,並沒有真正銷燬,為了說明這個問題,來做個試驗:開啟tomcat的工作目錄下正在執行的工程目錄:我的是E:\web\apache-tomcat-8.0.26\work\Catalina\localhost\E_shop,裡面只有一個org的資料夾,其他什麼也沒有,現在我們重啟tomcat伺服器,注意觀察這裡面的變化,當伺服器停掉後,這個該目錄下多了個SESSION.ser檔案,伺服器重啟成功後,該檔案又消失了。如下:
所以,如果專案中的POJO實現了Serializable介面,當反序列化的時候就能找到剛剛序列化時候的POJO,原來session中的內容就能成功反序列化,session還是原來的session,這樣原來頁面的東西還在,重新整理後還是繼續上次的操作。如果POJO沒有被例項化,那麼在session發序列化的時候當然就沒有了這些POJO了。下面看一下我的專案中的部分POJO,如下:
最後總結一下:
1. 容器關閉後session並沒有消失,而是被持久化到了硬盤裡;
2. 如果專案中的POJO實現了Serializable介面,那麼會跟著session一起被持久化到硬碟,在反序列化的時候會成功還原;
3. 要想伺服器重啟後,還是原來的session,還繼續緊接著原來的頁面操作的話,就需要例項化專案中的POJO。
_____________________________________________________________________________________________________________________________________________________
-----樂於分享,共同進步!