Session和Cookie的區(qū)別

1.理解Cookie

一般當(dāng)一個(gè)用戶(hù)第一次訪(fǎng)問(wèn)一個(gè)服務(wù)器時(shí),這個(gè)服務(wù)器會(huì)將一些Key/Value鍵值對(duì)返回給客戶(hù)端瀏覽器,并給這些數(shù)據(jù)加上一些限制條件,在條件符合時(shí)這個(gè)用戶(hù)下次訪(fǎng)問(wèn)這個(gè)服務(wù)器時(shí),數(shù)據(jù)又被完整地待會(huì)給服務(wù)器。

Http是一種無(wú)狀態(tài)協(xié)議,當(dāng)用戶(hù)的一次訪(fǎng)問(wèn)請(qǐng)求結(jié)束后,后端服務(wù)器就無(wú)法知道下一次來(lái)訪(fǎng)問(wèn)的還是不是上次訪(fǎng)問(wèn)的用戶(hù)。在設(shè)計(jì)應(yīng)用程序時(shí),兩次訪(fǎng)問(wèn)就不能知道是不是同一個(gè)人這對(duì)提升系統(tǒng)性能和用戶(hù)體驗(yàn)不利。于是Cookie就被設(shè)計(jì)為記錄用戶(hù)在一段時(shí)間內(nèi)訪(fǎng)問(wèn)Web應(yīng)用的行為路徑。這樣服務(wù)器就能根據(jù)Cookie值來(lái)劃分訪(fǎng)問(wèn)用戶(hù)了。

2.Cookie如何工作

真正構(gòu)建Cookie是在org.apache.catalina.connector.Response類(lèi)中完成的,調(diào)用generateCookieString方法將Cookie對(duì)象構(gòu)造成一個(gè)字符串,構(gòu)造成一個(gè)字符串,構(gòu)造的字符串格式如userName=“junshan”;Version=“1”。然后將這個(gè)字符串命名為Set-Cookie添加到MimeHeaders中。最后在Tomcat最終構(gòu)造Http響應(yīng)頭的代碼,在構(gòu)建HTTP返回字節(jié)流時(shí)是將Header中所有的項(xiàng)順序地寫(xiě)出,而沒(méi)有進(jìn)行任何修改,所以可以想象瀏覽器在接收HTTP返回?cái)?shù)據(jù)時(shí)是分別解析每一個(gè)Header項(xiàng)的。

3.使用Cookie的限制

Cookie是HTTP頭中的一個(gè)字段,雖然HTTP本身對(duì)這個(gè)字段并沒(méi)有多少限制,但是Cookie最終還是儲(chǔ)存在瀏覽器里,所以不同的瀏覽器對(duì)Cookie的存儲(chǔ)都有自己的限制。

IE6? ?20個(gè)/每個(gè)域名? ?4095個(gè)字節(jié)

IE7? ?50個(gè)/每個(gè)域名? ?4095個(gè)字節(jié)

IE8? ?50個(gè)/每個(gè)域名? ?4095個(gè)字節(jié)

IE9? ?50個(gè)/每個(gè)域名? ?4095個(gè)字節(jié)

Chrome? ? ?50個(gè)/每個(gè)域名? ?大于80000個(gè)字節(jié)

FireFox? ? ?50個(gè)/每個(gè)域名? ?4097個(gè)字節(jié)


理解Session

Cookie可以讓服務(wù)端程序跟蹤每個(gè)客戶(hù)端的訪(fǎng)問(wèn),但是每次客戶(hù)端的訪(fǎng)問(wèn)都必須傳回這些Cookie,如果Cookie很多,則無(wú)形地增加了客戶(hù)端與服務(wù)端的數(shù)據(jù)傳輸量,而Session的出現(xiàn)正是為了解決這個(gè)問(wèn)題。

同一個(gè)客戶(hù)端每次和服務(wù)端交互時(shí),不需要每次都傳回所有的Cookie值,而是只要傳回一個(gè)ID,這個(gè)ID是客戶(hù)端第一次訪(fǎng)問(wèn)服務(wù)器生成的,而且每個(gè)客戶(hù)端是唯一的。這樣每個(gè)客戶(hù)端就有了一個(gè)唯一的ID,客戶(hù)端只要傳回這個(gè)ID就行了,這個(gè)ID通常是NAME為JSESIONID的一個(gè)Cookie。

1.Session與Cookie

有三種方式可以讓Session正常工作。

? -基于URL Path Parameter,默認(rèn)支持。

? -基于Cookie,如果沒(méi)有修改Context容器的Cookie標(biāo)識(shí),則默認(rèn)也是支持的。

? -基于SSL,默認(rèn)不支持,只有connector.getAttribute("SSLEnabled")為T(mén)RUE時(shí)才支持。

2.Session如何工作

有了SessionID,服務(wù)端就可以創(chuàng)建HttpSession對(duì)象了,第一次觸發(fā)通過(guò)request.getSession()方法。如果當(dāng)前的Session ID還沒(méi)有對(duì)應(yīng)的HttpSession對(duì)象,那么就創(chuàng)建一個(gè)新的,并將這個(gè)對(duì)象加到org.apache.catalina.Manager的session容器中保存。Manager類(lèi)將管理所有Session的生命周期,Session過(guò)期將被回收,服務(wù)器關(guān)閉,Session將被序列化到磁盤(pán)等。只要這個(gè)HttpSession對(duì)象存在,用戶(hù)就可以根據(jù)SessionID來(lái)獲取這個(gè)對(duì)象,也就做到了對(duì)狀態(tài)的保持。

3.Cookie安全問(wèn)題

雖然Cookie和Session都可以跟蹤客戶(hù)端的訪(fǎng)問(wèn)記錄,但是他們的工作方式顯然是不同的,Cookie通過(guò)把所有要保持的數(shù)據(jù)通過(guò)HTTP的頭部從客戶(hù)端傳遞到服務(wù)器,從服務(wù)器再傳回到客戶(hù)端,所有的數(shù)據(jù)都存儲(chǔ)在客戶(hù)端的瀏覽器里,所以這些Cookie數(shù)據(jù)可以被訪(fǎng)問(wèn)到,甚至還可以修改。

4.分布式Session框架

實(shí)現(xiàn)思路:需要一個(gè)服務(wù)訂閱服務(wù)器,在應(yīng)用啟動(dòng)時(shí)可以從這個(gè)訂閱服務(wù)器訂閱這個(gè)應(yīng)用需要的可寫(xiě)Session項(xiàng)和可寫(xiě)Cookie項(xiàng),這些配置的Session和Cookie可以限制這個(gè)應(yīng)用能夠使用哪些Session和Cookie,甚至可以控制Session和Cookie可讀或者可寫(xiě)。這樣可以精確地控制哪些應(yīng)用可以操作哪些Session和Cookie,可以有效控制Session的安全性和Cookie的數(shù)量。

統(tǒng)一通過(guò)訂閱服務(wù)器推送配置可以有效地集中管理資源,所以可以省去每個(gè)應(yīng)用都來(lái)配置Cookie,簡(jiǎn)化Cookie的管理。如果應(yīng)用要使用一個(gè)新增的Cookie,則可以通過(guò)一個(gè)統(tǒng)一的平臺(tái)來(lái)申請(qǐng),申請(qǐng)通過(guò)才將這個(gè)配置項(xiàng)增加到訂閱服務(wù)器。如果是一個(gè)所有應(yīng)用都要使用的全局Cookie,那么只需將這個(gè)Cookie通過(guò)訂閱服務(wù)器統(tǒng)一推送過(guò)去就行了,省去了要在每個(gè)應(yīng)用中手動(dòng)增加Cookie的配置。

關(guān)于這個(gè)訂閱服務(wù)器現(xiàn)在有很多開(kāi)源的配置服務(wù)器,如Zookeeper集群管理服務(wù)器,可以統(tǒng)一管理所有服務(wù)器的配置文件。

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

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

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