session和cookies會話機制詳解

session management會話管理的原理


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


會話管理的基本方式

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


隱藏域實現會話管理

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

cookie實現會話管理

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

URL重寫實現會話管理

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


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

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

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

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

httpsession的工作機制

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

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

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

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

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

cookie的更多用處

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容

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