Session 和 Cookie 有什么區(qū)別

前言

Session 作用并存活于服務(wù)端此疹,Cookie 被用戶留在了本地設(shè)備中(客戶端)。Cookie 目的可以跟蹤會(huì)話,也可以保存用戶喜好或者保存用戶名密碼舔亭;
Session 用來跟蹤會(huì)話些膨。這是首先需要知道的一點(diǎn),然后我們先來詳細(xì)聊聊這兩個(gè)家伙吧钦铺。

Session

Session: 在計(jì)算機(jī)中订雾,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”矛洞。Session 對象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息洼哎。這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁之間跳轉(zhuǎn)時(shí)沼本,存儲(chǔ)在 Session 對象中的變量將不會(huì)丟失噩峦,而是在整個(gè)用戶會(huì)話中一直存在下去。當(dāng)用戶請求來自應(yīng)用程序的 Web 頁時(shí)抽兆,如果該用戶還沒有會(huì)話识补,則 Web 服務(wù)器將自動(dòng)創(chuàng)建一個(gè) Session 對象。當(dāng)會(huì)話過期或被放棄后辫红,服務(wù)器將終止該會(huì)話凭涂。Session 對象最常見的一個(gè)用法就是存儲(chǔ)用戶的首選項(xiàng)。例如贴妻,如果用戶指明不喜歡查看圖形切油,就可以將該信息存儲(chǔ)在 Session 對象中。有關(guān)使用 Session 對象的詳細(xì)信息揍瑟,請參閱“ASP 應(yīng)用程序”部分的“管理會(huì)話”白翻。注意 會(huì)話狀態(tài)僅在支持 cookie 的瀏覽器中保留。

Cookie

Cookie绢片,有時(shí)也用其復(fù)數(shù)形式 Cookies滤馍,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 session 跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)底循。定義于 RFC2109 和 2965 中的都已廢棄巢株,最新取代的規(guī)范是 RFC6265。(可以叫做瀏覽器緩存)
Cookie 在計(jì)算機(jī)中是個(gè)存儲(chǔ)在瀏覽器目錄中的文本文件熙涤,當(dāng)瀏覽器運(yùn)行時(shí)阁苞,存儲(chǔ)在 RAM 中發(fā)揮作用 (此種 Cookies 稱作 Session Cookies),一旦用戶從該網(wǎng)站或服務(wù)器退出祠挫,Cookie 可存儲(chǔ)在用戶本地的硬盤上 (此種 Cookies 稱作 Persistent Cookies)那槽。
通常情況下,當(dāng)用戶結(jié)束瀏覽器會(huì)話時(shí)等舔,系統(tǒng)將終止所有的 Cookie骚灸。當(dāng) Web 服務(wù)器創(chuàng)建了Cookies 后,只要在其有效期內(nèi)慌植,當(dāng)用戶訪問同一個(gè) Web 服務(wù)器時(shí)甚牲,瀏覽器首先要檢查本地的Cookies义郑,并將其原樣發(fā)送給 Web 服務(wù)器。這種狀態(tài)信息稱作“Persistent Client State HTTP Cookie” 丈钙,簡稱為 Cookies 非驮。

區(qū)別

  1. 由于 HTTP 協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時(shí)雏赦,就需要用某種機(jī)制來識具體的用戶劫笙,這個(gè)機(jī)制就是 Session。典型的場景比如購物車喉誊,當(dāng)你點(diǎn)擊下單按鈕時(shí)邀摆,由于 HTTP 協(xié)議無狀態(tài),所以并不知道是哪個(gè)用戶操作的伍茄,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的 Session栋盹,用用于標(biāo)識這個(gè)用戶,并且跟蹤用戶敷矫,這樣才知道購物車?yán)锩嬗袔妆緯瘛_@個(gè) Session 是保存在服務(wù)端的,有一個(gè)唯一標(biāo)識曹仗。在服務(wù)端保存 Session 的方法很多榨汤,內(nèi)存、數(shù)據(jù)庫怎茫、文件都有收壕。集群的時(shí)候也要考慮 Session 的轉(zhuǎn)移,在大型的網(wǎng)站轨蛤,一般會(huì)有專門的 Session 服務(wù)器集群蜜宪,用來保存用戶會(huì)話,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的祥山,使用一些緩存服務(wù)比如 Memcached 之類的來放 Session圃验。
  2. 思考一下服務(wù)端如何識別特定的客戶?這個(gè)時(shí)候 Cookie 就登場了缝呕。每次 HTTP 請求的時(shí)候澳窑,客戶端都會(huì)發(fā)送相應(yīng)的 Cookie 信息(保障在 Request Header 中)到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn) Session 跟蹤的供常,第一次創(chuàng)建 Session 的時(shí)候摊聋,服務(wù)端會(huì)在 HTTP 協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個(gè) Session ID栈暇,以后每次請求把這個(gè)會(huì)話 ID 發(fā)送到服務(wù)器栗精,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦悲立?一般這種情況下,會(huì)使用一種叫做 URL 重寫的技術(shù)來進(jìn)行會(huì)話跟蹤新博,即每次 HTTP 交互薪夕,URL 后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識別用戶赫悄。
  3. Cookie 其實(shí)還可以用在一些方便用戶的場景下原献,設(shè)想你某次登陸過一個(gè)網(wǎng)站,下次登錄的時(shí)候不想再次輸入賬號了埂淮,怎么辦姑隅?這個(gè)信息可以寫到 Cookie 里面,訪問網(wǎng)站的時(shí)候倔撞,網(wǎng)站頁面的腳本可以讀取這個(gè)信息讲仰,就自動(dòng)幫你把用戶名給填了,能夠方便一下用戶痪蝇。這也是 Cookie 名稱(譯名:小甜點(diǎn))的由來鄙陡,給用戶的一點(diǎn)甜頭。

總結(jié)

  1. Session 在服務(wù)器端躏啰,Cookie 在客戶端(瀏覽器)
  2. Session 默認(rèn)被存在在服務(wù)器的一個(gè)文件里
  3. Session 的運(yùn)行依賴 session id趁矾,而 session id 是存在 Cookie 中的,也就是說给僵,如果瀏覽器禁用了 Cookie 毫捣,同時(shí) session 也會(huì)失效(但是可以通過其它方式實(shí)現(xiàn),比如在 url 中傳遞 session_id)
  4. Session 可以放在 文件帝际、數(shù)據(jù)庫蔓同、或內(nèi)存中都可以。
  5. 用戶驗(yàn)證這種場合一般會(huì)用 Session

因此胡本,維持一個(gè)會(huì)話的核心就是客戶端的唯一標(biāo)識牌柄,即 session id

One More Thine

使用 Tomcat 等中間件的小伙伴們可能遇到過這樣的情況(或者還沒遇到過,也請注意一下)
關(guān)閉 Tomcat 后進(jìn)行重啟侧甫,之后再次獲取 Session珊佣,居然拿到了關(guān)閉前的 Session,為什么呢披粟,應(yīng)該被 Tomcat 清理了爸涠汀?
其實(shí)是守屉,Tomcat 在每次關(guān)閉的時(shí)候惑艇,都會(huì)將當(dāng)前每個(gè) Session 中的內(nèi)容寫到文件中,然后重新啟動(dòng) Tomcat 的時(shí)候讀取這個(gè)文件,并且驗(yàn)證 Session 是否超時(shí)滨巴,沒有超時(shí)就記錄了這個(gè)有效的 Session思灌。所以解決辦法也公布出來:
和 Tomcat 的配置有關(guān)系: tomcat/conf/context.xml 配置中:

<!-- Uncomment this to disable session persistence across Tomcat restarts -->    
<!--  
<Manager pathname="" />  
 --> 

取消注釋就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恭取,一起剝皮案震驚了整個(gè)濱河市泰偿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜈垮,老刑警劉巖耗跛,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異攒发,居然都是意外死亡调塌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惠猿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羔砾,“玉大人,你說我怎么就攤上這事紊扬⊙亚眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵餐屎,是天一觀的道長檀葛。 經(jīng)常有香客問我,道長腹缩,這世上最難降的妖魔是什么屿聋? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮藏鹊,結(jié)果婚禮上润讥,老公的妹妹穿的比我還像新娘。我一直安慰自己盘寡,他們只是感情好楚殿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竿痰,像睡著了一般脆粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上影涉,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天变隔,我揣著相機(jī)與錄音,去河邊找鬼蟹倾。 笑死匣缘,一個(gè)胖子當(dāng)著我的面吹牛猖闪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肌厨,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼培慌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柑爸?” 一聲冷哼從身側(cè)響起检柬,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竖配,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體里逆,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡进胯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了原押。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胁镐。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诸衔,靈堂內(nèi)的尸體忽然破棺而出盯漂,到底是詐尸還是另有隱情,我是刑警寧澤笨农,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布就缆,位于F島的核電站,受9級特大地震影響谒亦,放射性物質(zhì)發(fā)生泄漏竭宰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一份招、第九天 我趴在偏房一處隱蔽的房頂上張望切揭。 院中可真熱鬧,春花似錦锁摔、人聲如沸廓旬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孕豹。三九已至,卻和暖如春怔蚌,著一層夾襖步出監(jiān)牢的瞬間巩步,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工桦踊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椅野,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像竟闪,于是被迫代替她去往敵國和親离福。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容