1. 程式人生 > >Session和Cookie總結

Session和Cookie總結

.cn 流程 src () 信息 選擇 cookie 查找 導致

一.Session和Cookie

  1.Cookie

   1.cookie創建於服務器,保存於瀏覽器,保存了特定網站操作記錄和資料憑證的信息。

    2.未設置cookie期限的時候,默認是關閉瀏覽器後cookie消失,此時cookie保存於內存中,這種cookie稱為會話cookie。

    3.設置了過期時間的cookie會被保存到硬盤中,在下次啟動瀏覽器後,只要還未超過過期時間還能繼續使用,過期將被清除。

    4.cookie過期時間通過 cookie.setMaxAge(2000) 來設置。

    註意:設置了cookie.setMaxAge但是下次請求通過req.getMaxAge()取得的值總是-1的原因如下:

       第一次請求服務時,服務器端傳輸cookie並寫到客戶端,瀏覽器關閉,cookie設置生效。
     第二次請求服務,request請求傳給服務端,但在這個request中是不包含maxage值的,所以服務端取到的值還是默認值-1。也就是說設置完maxage值後,maxage不會再被服務端讀取和修改了。這一過
  程由瀏覽器完成,瀏覽器判斷maxage的值,從而判斷cookie是否過期,期間服務器並不會參與cookie的生命周期過程。所以你在debug中取到的值一直是默認值!
     

技術分享

  2.Session

     Session保存於服務器,為了高速存取,一般放在內存中,在瀏覽器第一次請求服務去的時候會為瀏覽器創建一個Session,因為HTTP請求是無狀態的,所以會在瀏覽器端以Cookie形式保存一個JSESSIONID用於查找保存在服務器端session的憑證。

    技術分享

    每次請求的時候會判斷請求頭是否含有可用的JSESSIONID的Cookie,通過JSESSIONID查找對應的session,如果不存在則重新創建一個session,並把JSESSION保存到瀏覽器。所以二次請求的時候請求頭裏是帶有JSESSIONID的Cookie的,通過jsessionid ==request.getSession().getId()獲取sessionID.

    技術分享

    JSESSIONID的Cookie會在瀏覽器關閉後清除,下次從新開啟時是不存在的 。

    請求流程:

    技術分享

二.Session生命周期

  1.session過期時間:

    session的是保存瀏覽器和服務器間信息的一塊內存,在服務器規定時間內,如果瀏覽器沒有對服務器進行任何的請求,那麽規定時間段結束,服務器將會清除該過期的session,並釋放內存,不然越來越多的session占用了內存卻不工作,會導致服務器內存不斷消耗,導致服務器崩潰。tomcat默認保存時間是20分鐘(這是指在20分鐘內瀏覽器不發生任何請求行為,如果有請求行為每次這個時間都會更新重置)

  2.Session對瀏覽器的要求:

  Cookie為服務器自動生成的,它的maxAge屬性一般為-1,表示僅當前瀏覽器內有效,並且各瀏覽器窗口間不共享,關閉瀏覽器就會失效。因此同一機器的兩個瀏覽器窗口訪問服務器時,會生成兩個不同的Session。但是由瀏覽器窗口內的鏈接、腳本等打開的新窗口(也就是說不是雙擊桌面瀏覽器圖標等打開的窗口)除外。這類子窗口會共享父窗口的Cookie,因此會共享一個Session。

  註意:新開的瀏覽器窗口會生成新的Session,但子窗口除外。子窗口會共用父窗口的Session。例如,在鏈接上右擊,在彈出的快捷菜單中選擇"在新窗口中打開"時,子窗口便可以訪問父窗口的Session。

  2.1如果客戶端瀏覽器將Cookie功能禁用,或者不支持Cookie怎麽辦?

  例如,絕大多數的手機瀏覽器都不支持Cookie。Java Web提供了另一種解決方案:URL地址重寫。

  URL地址重寫是對客戶端不支持Cookie的解決方案。URL地址重寫的原理是將該用戶Session的id信息重寫到URL地址中。服務器能夠解析重寫後的URL獲取Session的id。這樣即使客戶端不支持Cookie,也可以使用Session來記錄用戶狀態。HttpServletResponse類提供了encodeURL(String url)實現URL地址重寫,該方法會自動判斷客戶端是否支持Cookie。如果客戶端支持Cookie,會將URL原封不動地輸出來。如果客戶端不支持Cookie,則會將用戶Session的id重寫到URL中。

  註意:TOMCAT判斷客戶端瀏覽器是否支持Cookie的依據是請求中是否含有Cookie。盡管客戶端可能會支持Cookie,但是由於第一次請求時不會攜帶任何Cookie(因為並無任何Cookie可以攜帶),URL地址重寫後的地址中仍然會帶有jsessionid。當第二次訪問時服務器已經在瀏覽器中寫入Cookie了,因此URL地址重寫後的地址中就不會帶有jsessionid了。

  

Session和Cookie總結