會話對象session的創建,保存以及與客戶端之間會話原理,過程

一:session的解釋:

      session即會話對象,它保存了本次客戶端與服務端的通信信息。且session數據是存放在服務端的。

二:與客戶端的通信過程

   服務端爲他們之間的會話創建一個session對象。並生成一個唯一sessionId(JSessionId)返回給客戶端的Cookie中,這個JsessionId對應於服務端創建的session對象,之後客戶端每次向服務端發送請求攜帶着JsessionId對象,服務端通過JsessionId來找到對應的session對象使用。若客戶端沒有攜帶JsessionId,則創建一個session並且生成一個於此相關聯的JSessionId來返回客戶端。

問題:如何保證多次請求是同一會話對象或者服務端如何確定用戶的身份?

    服務端通過向客戶端寫一個Jsessionid。客戶端每次請求將攜帶Jsessionid的值,服務端每次會根據客戶端所帶的JsessionId的值來判斷是否爲同一用戶。


以下是我遇到的一些問題進行總結:

1.sessionid如何產生?由誰產生?保存在哪裏?

面試問道這個我居然不知道怎麼回答,當然也是因爲我確實沒有研究過。下面就是百度了一篇文章後簡單回答這個問題。

參考:http://www.cnblogs.com/sharpxiajun/p/3395607.html

http://lavasoft.blog.51cto.com/62575/275589/

sessionid是一個會話的key,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應。tomcat生成的sessionid叫做jsessionid。

session在訪問tomcat服務器HttpServletRequest的getSession(true)的時候創建,tomcat的ManagerBase類提供創建sessionid的方法:隨機數+時間+jvmid

它存儲在服務器的內存中,tomcat的StandardManager類將session存儲在內存中,也可以持久化到file,數據庫,memcache,redis等。客戶端只保存sessionid到cookie中,而不會保存session,session銷燬只能通過invalidate或超時,關掉瀏覽器並不會關閉session。

2.Session在何時創建呢?

      當然還是在服務器端程序運行的過程中創建的,不同語言實現的應用程序有不同創建Session的方法,而在Java中是通過調用HttpServletRequest的getSession方法(使用true作爲參數)創建的。在創建了Session的同時,服務器會爲該Session生成唯一的Session id,而這個Session id在隨後的請求中會被用來重新獲得已經創建的Session;在Session被創建之後,就可以調用Session相關的方法往Session中增加內容了,而這些內容只會保存在服務器中,發到客戶端的只有Session id;當客戶端再次發送請求的時候,會將這個Session id帶上,服務器接受到請求之後就會依據Session id找到相應的Session,從而再次使用之。

創建:sessionid第一次產生是在直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建。

刪除:超時;程序調用HttpSession.invalidate();程序關閉;

session存放在哪裏:服務器端的內存中。不過session可以通過特殊的方式做持久化管理(memcache,redis)。

session的id是從哪裏來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端創建一個session,並將通過特殊算法算出一個session的ID,用來標識該session對象

3.如何刪除或者使會話對象失效:
   1)服務器角度:重新啓動服務器
      客戶端角度:①手動刪除JSessionId信息  ②設置失效時間③關閉瀏覽器
   2)session會因爲瀏覽器的關閉而刪除嗎?
       Cookie分爲內存中Cookie(也可以說是進程中Cookie)和硬盤中Cookie。大部分的Session機制都使用進程中Cookie來保存Session id的,關閉瀏覽器後這
   個進程也就自動消失了,進程中的Cookie自然就消失了,那麼Session id也跟着消失了,再次連接到服務器時也就無法找到原來的Session了。
       其實服務器是不會知道瀏覽器關閉了沒有(當然,你可以在關閉的時候去通知服務器,但一般都不會這樣做),所以關閉瀏覽器時服務器是不會刪除    Session的,也正是這個原因服務器纔會設置一個Session失效時間的,不然服務器早晚會被撐爆的。等距離上一次使用該Session的時間達到設置的失效時間
 時,服務器就會認爲客戶端已停止活動,便會將相應的Session刪除。
      
當然,我們可以在登陸時點擊下次自動登錄,比如說CSDN的“記住我一週”,或者我們的購物車信息可以在切換不同瀏覽器時依然可用。這就要用到我們上文提到的另一種Cookie了——硬盤中Cookie,這時Session id將長期保存在硬盤上的Cookie中,直到失效爲止。
 
4.下面是tomcat中session的創建:
       ManagerBase是所有session管理工具類的基類,它是一個抽象類,所有具體實現session管理功能的類都要繼承這個類,該類有一個受保護的方法,該方法就是創建sessionId值的方法:
tomcat的session的id值生成的機制是一個隨機數加時間加上jvm的id值,jvm的id值會根據服務器的硬件信息計算得來,因此不同jvm的id值都是唯一的),
     StandardManager類是tomcat容器裏默認的session管理實現類,
它會將session的信息存儲到web容器所在服務器的內存裏
PersistentManagerBase也是繼承ManagerBase類,它是所有持久化存儲session信息的基類,PersistentManager繼承了PersistentManagerBase,但是這個類只是多了一個靜態變量和一個getName方法,目前看來意義不大,對於持久化存儲session,tomcat還提供了StoreBase的抽象類,它是所有持久化存儲session的基類,另外tomcat還給出了文件存儲FileStore和數據存儲JDBCStore兩個實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章