session和cookies會話機制詳解

session management會話管理的原理


web請求與響應基于http,而http是無狀態(tài)協(xié)議。所以我們?yōu)榱丝缭蕉鄠€請求保留用戶的狀態(tài),需要利用某種工具幫助我們記錄與識別每一次請求及請求的其他信息。舉個栗子,我們在淘寶購物的時候,首先添加了一本《C++ primer》進入購物車,然后我們又繼續(xù)去搜索《thinking in java》,繼續(xù)添加購物車,這時購物車應該有兩本書。但如果我們不采取session management會話管理的話,基于http無狀態(tài)協(xié)議,我們在第二次向購物車發(fā)出添加請求時,他是無法知道我們第一次添加請求的信息的。所以,我們就需要session management會話管理!


會話管理的基本方式

會話管理的基本主要有隱藏域,cookies,與URL重寫這幾種實現(xiàn)方式。用得較多的是后兩種。


隱藏域?qū)崿F(xiàn)會話管理

以一個網(wǎng)絡注冊信息填寫為例。
我們在填注冊信息的時候,經(jīng)常遇到填完一個頁面的內(nèi)容之后,還要繼續(xù)填寫下一個頁面的內(nèi)容。但由于http的無狀態(tài),那么容易造成的后果,當進入第二頁填寫的時候,服務器已經(jīng)不記得我們上一頁填寫了什么。
怎么利用隱藏域解決這個問題呢?
顧名思義,其實就是既然服務器不會記得兩次請求間的關系,那就由瀏覽器在每次請求時主動告訴服務器多次請求間的必要信息,但是上一頁的信息并不顯示在第二頁中,而是采用隱藏域的方式。
然而顯然這種方式是存在各種問題的。
比如關掉網(wǎng)頁之后,就會遺失信息,而且查看網(wǎng)頁源代碼時,容易暴露信息,安全性不高。隱藏域并不是servlet/jsp實際會話管理的機制。

cookie實現(xiàn)會話管理

cookie是什么?舉個簡單的例子,現(xiàn)在當我們?yōu)g覽網(wǎng)站的時候,經(jīng)常會自動保存賬號與密碼,這樣下次訪問的時候,就可以直接登錄了。這種技術的實現(xiàn)就是利用了cookie技術。** cookie是存儲key-value對的一個文件,務必記住,它是由服務器將cookie添加到response里一并返回給客戶端,然后客戶端會自動把response里的cookie接收下來,并且保存到本地,下次發(fā)出請求的時候,就會把cookie附加在request里,服務器在根據(jù)request里的cookie遍歷搜索是否有與之符合的信息 **
具體cookie的實現(xiàn)我們會在后面詳細講到

URL重寫實現(xiàn)會話管理

URL重寫就是將需要記錄的信息附加在請求的鏈接背后,以鏈接參數(shù)的形式發(fā)送給服務器識別。具體實現(xiàn)的過程會在后文結(jié)合cookie詳解。


servlet&jsp中的session會話管理機制

** 利用httpsession對象進行會話管理。httpsession對象可以保存跨同一個客戶多個請求的會話狀態(tài)。**

換句話說,與一個特定客戶的整個會話期間看,httpsession會持久儲存。

**對于會話期間客戶做的所有請求,從中得到的所有信息都可以用httpsession對象保存。 **

httpsession的工作機制

  • 以之前的問卷調(diào)查為例,當一個新客戶小明填寫問卷時,服務器會生成一個httpsession對象,用于保存會話期間小明所選擇的信息,服務器會以setAttribute的方式將其保存到httpsession對象中。
    每個客戶會有一個獨立的httpsession對象,保存這個客戶所有請求所需要保存的信息。
  • 服務器如何識別所有的請求是否來自同一個客戶?
    客戶需要一個會話ID來標識自己。就跟我們每個人的身份證號一樣。對于客戶的第一個請求,容器會生成一個唯一的會話ID,并通過相應把它返回給用戶,客戶在以后發(fā)回一個請求中發(fā)回這個會話ID,容器看到ID之后,就會找到匹配的會話,并把這個會話與請求關聯(lián)。
  • 實現(xiàn)存儲會話ID的就是通過cookie!
Paste_Image.png

cookie存儲在客戶端,是被服務器放在response里發(fā)回客戶端的,以后每次request時,都會把cookie加入到request里。
而session是存在服務器的,以屬性的形式將會話中的信息存到httpsession對象中。調(diào)用時,只要通過httpsession對象調(diào)用相應attribute即可。

  • 很多地方總是把session與cookie分開單獨講。但我們通過前面的介紹,不難知道,session實現(xiàn)其會話管理機制時,在如何確定所有請求是否來自同一個客戶時,是利用了cookie技術的。所以不應該將cookie與session完全分開講。

  • 這里產(chǎn)生這個誤解的原因。是因為我們對session的會話管理機制不夠了解。因為容器在創(chuàng)建session對象時,會幫我們實現(xiàn)所有cookie相關的工作,而我們只需要實現(xiàn)這一句:
    HttpSession session = request.getSession();
    記?。?** 這個方法不只是創(chuàng)建一個會話,而是會完成所有與cookie相關的工作,只是容器都自動幫我們實現(xiàn)了。我們來看看容器在背后默默為我們做了什么:

    • 建立新的httpsession對象
    • 生成唯一的會話ID
    • 建立新的會話對象
    • 把會話ID與cookie關聯(lián)
    • 在響應中設置cookie
      cookie所有的工作都在后臺進行。
      看到這里,是不是很爽?容器幾乎幫我們實現(xiàn)了所有cookie工作。
  • 從請求中得到會話ID
    只需一行代碼:
    HttpSession session = request.getSession();
    與上一部分為響應生成會話ID是一致的
    其中也在后臺實現(xiàn)了一些步驟:
    if(請求包含一個會話ID)
    找到與該ID匹配的會話
    else if(沒有會話ID或者沒有匹配的ID)
    創(chuàng)建一個新的會話。
    還是那句話: ** cookie所有工作都在后臺自動進行 **

cookie的更多用處

cookie原先設計的初衷就是為了幫助支持會話狀態(tài)。但是因為cookie的簡便性,容器為我們封裝了大量操作?,F(xiàn)在cookie已經(jīng)被越來越運用到各個方面。
首先,** 我們明確cookie是存在客戶端的,實際上就是在客戶端與服務端交換的一小段數(shù)據(jù)(一個name/string對)。**
由于session在用戶關閉瀏覽器后,會話結(jié)束,就會消失,cookie隨之應該也會消失。但servlet的API中提供了一些方法,可以讓客戶端的cookie存活的時間更久一點。這就是cookie相對于session的一大優(yōu)勢所在。我們目前常用的記住用戶名和密碼,下次登錄就是利用cookie在session消失后,還能存活實現(xiàn)的。
所以,我們可以定制cookie為我們實現(xiàn)各種功能。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,794評論 11 349
  • 轉(zhuǎn)自:http://justsee.iteye.com/blog/1570652 雖然session機制在web應...
    Maggie編程去閱讀 533評論 0 6
  • 一、cookie機制和session機制的區(qū)別 具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案,而sess...
    Rella7閱讀 4,775評論 0 7
  • 鳳凰是神鳥 永遠不死 這不死是涅槃的代價 浴火重生的輪回 驗證生命的洗禮 嬋,蠶,蛇,乃至鳳凰 褪下痛苦,折磨 翱...
    圩原君閱讀 458評論 0 2
  • 悼亡憶舊(四首) 半路分攜子竟行,只留殘瑟作哀鳴。 元非太上能輕世,恰是中人敢忘情?注1 梅影散香風一陣,子規(guī)啼血...
    金橘對芙蓉閱讀 609評論 0 0

友情鏈接更多精彩內(nèi)容