前言
? ? HTTP是一種無狀態(tài)的協(xié)議滤奈,為了分辨鏈接是誰發(fā)起的挪捕,需自己去解決這個問題槽地。不然有些情況下即使是同一個網(wǎng)站每打開一個頁面也都要登錄一下。而Session和Cookie就是為解決這個問題而提出來的兩個機制写妥。
應(yīng)用場景
? ? a,登錄網(wǎng)站,今輸入用戶名密碼登錄了审姓,第二天再打開很多情況下就直接打開了耳标。這個時候用到的一個機制就是cookie。
? ? b,session一個場景是購物車邑跪,添加了商品之后客戶端處可以知道添加了哪些商品次坡,而服務(wù)器端如何判別呢呼猪,所以也需要存儲一些信息就用到了session。
1.Cookie
? ? a,通俗講砸琅,是訪問某些網(wǎng)站后在本地存儲的一些網(wǎng)站相關(guān)信息宋距,下次訪問時減少一些步驟。更準(zhǔn)確的說法是:Cookies是服務(wù)器在本地機器上存儲的小段文本并隨每一個請求發(fā)送至同一服務(wù)器症脂,是在客戶端保持狀態(tài)的方案谚赎。
?? b, Cookie的主要內(nèi)容包括:名字,值诱篷,過期時間壶唤,路徑和域。使用Fiddler抓包就可以看見棕所,比方說我們打開百度的某個網(wǎng)站可以看到Headers包括Cookie闸盔,如下:
?? c, key, value形式。過期時間可設(shè)置的琳省,如不設(shè)迎吵,則瀏覽器關(guān)掉就消失了,存儲在內(nèi)存當(dāng)中针贬,否則就按設(shè)置的時間來存儲在硬盤上的击费,過期后自動清除,比方說開關(guān)機關(guān)閉再打開瀏覽器后他都會還存在桦他,前者稱之為Session cookie 又叫 transient cookie蔫巩,后者稱之為Persistent cookie 又叫 permenent cookie。路徑和域就是對應(yīng)的域名快压,a網(wǎng)站的cookie自然不能給b用批幌。
2.Session
a,存在服務(wù)器的一種用來存放用戶數(shù)據(jù)的類HashTable結(jié)構(gòu)。
b,瀏覽器第一次發(fā)送請求時嗓节,服務(wù)器自動生成了一HashTable和一Session ID來唯一標(biāo)識這個HashTable荧缘,并將其通過響應(yīng)發(fā)送到瀏覽器。瀏覽器第二次發(fā)送請求會將前一次服務(wù)器響應(yīng)中的Session ID放在請求中一并發(fā)送到服務(wù)器上拦宣,服務(wù)器從請求中提取出Session ID截粗,并和保存的所有Session ID進行對比,找到這個用戶對應(yīng)的HashTable鸵隧。
?c,一般這個值會有個時間限制绸罗,超時后毀掉這個值,默認(rèn)30分鐘豆瘫。
d,當(dāng)用戶在應(yīng)用程序的 Web頁間跳轉(zhuǎn)時珊蟀,存儲在 Session 對象中的變量不會丟失而是在整個用戶會話中一直存在下去。
e,Session的實現(xiàn)方式和Cookie有一定關(guān)系。建立一個連接就生成一個session id育灸,打開幾個頁面就好幾個了腻窒,這里就用到了Cookie,把session id存在Cookie中磅崭,每次訪問的時候?qū)ession id帶過去就可以識別了.
區(qū)別:
? ? a,存儲數(shù)據(jù)量方面:session 能夠存儲任意的 java 對象儿子,cookie 只能存儲 String 類型的對象
? ? b,一個在客戶端一個在服務(wù)端。因Cookie在客戶端所以可以編輯偽造砸喻,不是十分安全柔逼。
?? c, Session過多時會消耗服務(wù)器資源,大型網(wǎng)站會有專門Session服務(wù)器割岛,Cookie存在客戶端沒問題愉适。
?? d, 域的支持范圍不一樣,比方說a.com的Cookie在a.com下都能用癣漆,而www.a.com的Session在api.a.com下都不能用维咸,解決這個問題的辦法是JSONP或者跨域資源共享。
session多服務(wù)器間共享
?? 1, 服務(wù)器實現(xiàn)的 session 復(fù)制或 session 共享扑媚,如 webSphere或 JBOSS 在搭集群時配置實現(xiàn) session 復(fù)制或 session 共享.致命缺點:不好擴展和移植腰湾。
? ? 2,利用成熟技術(shù)做session復(fù)制雷恃,如12306使用的gemfire疆股,如常見內(nèi)存數(shù)據(jù)庫redis或memorycache,雖較普適但依賴第三方.
? ? 3,將 session維護在客戶端倒槐,利用 cookie旬痹,但客戶端存在風(fēng)險數(shù)據(jù)不安全,且可以存放的數(shù)據(jù)量較小讨越,所以將session 維護在客戶端還要對 session 中的信息加密两残。
?? 4, 第二種方案和第三種方案的合體,可用gemfire實現(xiàn) session 復(fù)制共享把跨,還可將session 維護在 redis中實現(xiàn) session 共享人弓,同時可將 session 維護在客戶端的cookie 中,但前提是數(shù)據(jù)要加密着逐。
這三種方式可迅速切換崔赌,而不影響應(yīng)用正常執(zhí)行。在實踐中耸别,首選 gemfire 或者 redis 作為 session 共享的載體健芭,一旦 session 不穩(wěn)定出現(xiàn)問題的時候,可以緊急切換 cookie 維護 session 作為備用秀姐,不影響應(yīng)用提供服務(wù)
單點登錄中慈迈,cookie 被禁用了怎么辦?(一點登陸省有,子網(wǎng)站其他系統(tǒng)不用再登陸)
?? 1, 單點登錄的原理是后端生成一個 session ID痒留,設(shè)置到 cookie谴麦,后面所有請求瀏覽器都會帶上cookie,然后服務(wù)端從cookie獲取 session ID狭瞎,查詢到用戶信息细移。
? ? 2,所以,保持登錄的關(guān)鍵不是cookie熊锭,而是通過cookie 保存和傳輸?shù)?session ID弧轧,本質(zhì)是能獲取用戶信息的數(shù)據(jù)。
? ? 3,除了cookie碗殷,還常用 HTTP 請求頭來傳輸精绎。但這個請求頭瀏覽器不會像cookie一樣自動攜帶,需手工處理