千鋒扣丁學(xué)堂Java培訓(xùn)之Cookie和Session常見(jiàn)面試點(diǎn)的區(qū)別
2019-08-09 13:54:31
4122瀏覽
今天千鋒扣丁學(xué)堂Java培訓(xùn)老師給大家分享一篇關(guān)于Cookie和Session的區(qū)別的詳細(xì)介紹,首先大部分的面試者應(yīng)該都可以說(shuō)上一兩句,比如:什么是Cookie?什么是Session??jī)烧叩膮^(qū)別等。但如果再往深入探討的話,就慢慢有一些朋友不太了解了,談起原理時(shí)就很少有朋友全部回答準(zhǔn)確。今天和大家一起深入聊聊有關(guān)Cookie和Session的話題。
1、什么是Cookie和Session?初級(jí)程序員高頻面試題。
什么是Cookie
HTTPCookie(也叫WebCookie或?yàn)g覽器Cookie)是服務(wù)器發(fā)送到用戶(hù)瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上。通常,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器,如保持用戶(hù)的登錄狀態(tài)。Cookie使基于無(wú)狀態(tài)的HTTP協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。
Cookie主要用于以下三個(gè)方面:
會(huì)話狀態(tài)管理(如用戶(hù)登錄狀態(tài)、購(gòu)物車(chē)、游戲分?jǐn)?shù)或其它需要記錄的信息)
個(gè)性化設(shè)置(如用戶(hù)自定義設(shè)置、主題等)
瀏覽器行為跟蹤(如跟蹤分析用戶(hù)行為等)
什么是Session
Session代表著服務(wù)器和客戶(hù)端一次會(huì)話的過(guò)程。Session對(duì)象存儲(chǔ)特定用戶(hù)會(huì)話所需的屬性及配置信息。這樣,當(dāng)用戶(hù)在應(yīng)用程序的Web頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在Session對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶(hù)會(huì)話中一直存在下去。當(dāng)客戶(hù)端關(guān)閉會(huì)話,或者Session超時(shí)失效時(shí)會(huì)話結(jié)束。
2、Cookie和Session有什么不同?
作用范圍不同,Cookie保存在客戶(hù)端(瀏覽器),Session保存在服務(wù)器端。
存取方式的不同,Cookie只能保存ASCII,Session可以存任意數(shù)據(jù)類(lèi)型,一般情況下我們可以在Session中保持一些常用變量信息,比如說(shuō)UserId等。
有效期不同,Cookie可設(shè)置為長(zhǎng)時(shí)間保持,比如我們經(jīng)常使用的默認(rèn)登錄功能,Session一般失效時(shí)間較短,客戶(hù)端關(guān)閉或者Session超時(shí)都會(huì)失效。
隱私策略不同,Cookie存儲(chǔ)在客戶(hù)端,比較容易遭到不法獲取,早期有人將用戶(hù)的登錄名和密碼存儲(chǔ)在Cookie中導(dǎo)致信息被竊取;Session存儲(chǔ)在服務(wù)端,安全性相對(duì)Cookie要好一些。
存儲(chǔ)大小不同,單個(gè)Cookie保存的數(shù)據(jù)不能超過(guò)4K,Session可存儲(chǔ)數(shù)據(jù)遠(yuǎn)高于Cookie。
3、為什么需要Cookie和Session,他們有什么關(guān)聯(lián)?
說(shuō)起來(lái)為什么需要Cookie,這就需要從瀏覽器開(kāi)始說(shuō)起,我們都知道瀏覽器是沒(méi)有狀態(tài)的(HTTP協(xié)議無(wú)狀態(tài)),這意味著瀏覽器并不知道是張三還是李四在和服務(wù)端打交道。這個(gè)時(shí)候就需要有一個(gè)機(jī)制來(lái)告訴服務(wù)端,本次操作用戶(hù)是否登錄,是哪個(gè)用戶(hù)在執(zhí)行的操作,那這套機(jī)制的實(shí)現(xiàn)就需要Cookie和Session的配合。
那么Cookie和Session是如何配合的呢?我畫(huà)了一張圖大家可以先了解下。
用戶(hù)第一次請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器根據(jù)用戶(hù)提交的相關(guān)信息,創(chuàng)建創(chuàng)建對(duì)應(yīng)的Session,請(qǐng)求返回時(shí)將此Session的唯一標(biāo)識(shí)信息SessionID返回給瀏覽器,瀏覽器接收到服務(wù)器返回的SessionID信息后,會(huì)將此信息存入到Cookie中,同時(shí)Cookie記錄此SessionID屬于哪個(gè)域名。
當(dāng)用戶(hù)第二次訪問(wèn)服務(wù)器的時(shí)候,請(qǐng)求會(huì)自動(dòng)判斷此域名下是否存在Cookie信息,如果存在自動(dòng)將Cookie信息也發(fā)送給服務(wù)端,服務(wù)端會(huì)從Cookie中獲取SessionID,再根據(jù)SessionID查找對(duì)應(yīng)的Session信息,如果沒(méi)有找到說(shuō)明用戶(hù)沒(méi)有登錄或者登錄失效,如果找到Session證明用戶(hù)已經(jīng)登錄可執(zhí)行后面操作。
根據(jù)以上流程可知,SessionID是連接Cookie和Session的一道橋梁,大部分系統(tǒng)也是根據(jù)此原理來(lái)驗(yàn)證用戶(hù)登錄狀態(tài)。
4、既然服務(wù)端是根據(jù)Cookie中的信息判斷用戶(hù)是否登錄,那么如果瀏覽器中禁止了Cookie,如何保障整個(gè)機(jī)制的正常運(yùn)轉(zhuǎn)。
第一種方案,每次請(qǐng)求中都攜帶一個(gè)SessionID的參數(shù),也可以Post的方式提交,也可以在請(qǐng)求的地址后面拼接xxx?SessionID=123456...。
第二種方案,Token機(jī)制。Token機(jī)制多用于App客戶(hù)端和服務(wù)器交互的模式,也可以用于Web端做用戶(hù)狀態(tài)管理。
Token的意思是“令牌”,是服務(wù)端生成的一串字符串,作為客戶(hù)端進(jìn)行請(qǐng)求的一個(gè)標(biāo)識(shí)。Token機(jī)制和Cookie和Session的使用機(jī)制比較類(lèi)似。
當(dāng)用戶(hù)第一次登錄后,服務(wù)器根據(jù)提交的用戶(hù)信息生成一個(gè)Token,響應(yīng)時(shí)將Token返回給客戶(hù)端,以后客戶(hù)端只需帶上這個(gè)Token前來(lái)請(qǐng)求數(shù)據(jù)即可,無(wú)需再次登錄驗(yàn)證。
5、如何考慮分布式Session問(wèn)題?
在互聯(lián)網(wǎng)公司為了可以支撐更大的流量,后端往往需要多臺(tái)服務(wù)器共同來(lái)支撐前端用戶(hù)請(qǐng)求,那如果用戶(hù)在A服務(wù)器登錄了,第二次請(qǐng)求跑到服務(wù)B就會(huì)出現(xiàn)登錄失效問(wèn)題。
分布式Session一般會(huì)有以下幾種解決方案:
Nginxip_hash策略,服務(wù)端使用Nginx代理,每個(gè)請(qǐng)求按訪問(wèn)IP的hash分配,這樣來(lái)自同一IP固定訪問(wèn)一個(gè)后臺(tái)服務(wù)器,避免了在服務(wù)器A創(chuàng)建Session,第二次分發(fā)到服務(wù)器B的現(xiàn)象。
Session復(fù)制,任何一個(gè)服務(wù)器上的Session發(fā)生改變(增刪改),該節(jié)點(diǎn)會(huì)把這個(gè)Session的所有內(nèi)容序列化,然后廣播給所有其它節(jié)點(diǎn)。
共享Session,服務(wù)端無(wú)狀態(tài)話,將用戶(hù)的Session等信息使用緩存中間件來(lái)統(tǒng)一管理,保障分發(fā)到每一個(gè)服務(wù)器的響應(yīng)結(jié)果都一致。
6、如何解決跨域請(qǐng)求?Jsonp跨域的原理是什么?
說(shuō)起跨域請(qǐng)求,必須要了解瀏覽器的同源策略,同源策略/SOP(Sameoriginpolicy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協(xié)議+域名+端口"三者相同,即便兩個(gè)不同的域名指向同一個(gè)ip地址,也非同源。
解決跨域請(qǐng)求的常用方法是:
通過(guò)代理來(lái)避免,比如使用Nginx在后端轉(zhuǎn)發(fā)請(qǐng)求,避免了前端出現(xiàn)跨域的問(wèn)題。
通過(guò)Jsonp跨域
其它跨域解決方案
重點(diǎn)談一下Jsonp跨域原理。瀏覽器的同源策略把跨域請(qǐng)求都禁止了,但是頁(yè)面中的<script><img><iframe>標(biāo)簽是例外,不受同源策略限制。Jsonp就是利用<script>標(biāo)簽跨域特性進(jìn)行跨域數(shù)據(jù)訪問(wèn)。
JSONP的理念就是,與服務(wù)端約定好一個(gè)回調(diào)函數(shù)名,服務(wù)端接收到請(qǐng)求后,將返回一段Javascript,在這段Javascript代碼中調(diào)用了約定好的回調(diào)函數(shù),并且將數(shù)據(jù)作為參數(shù)進(jìn)行傳遞。當(dāng)網(wǎng)頁(yè)接收到這段Javascript代碼后,就會(huì)執(zhí)行這個(gè)回調(diào)函數(shù),這時(shí)數(shù)據(jù)已經(jīng)成功傳輸?shù)娇蛻?hù)端了。
JSONP的缺點(diǎn)是:它只支持GET請(qǐng)求,而不支持POST請(qǐng)求等其他類(lèi)型的HTTP請(qǐng)求。
以上就是關(guān)于千鋒扣丁學(xué)堂Java培訓(xùn)之Cookie和Session常見(jiàn)面試點(diǎn)區(qū)別的全部?jī)?nèi)容,
想要學(xué)好Java開(kāi)發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專(zhuān)業(yè)老師制定的Java學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的Java課程體系和Java視頻教程供大家學(xué)習(xí),想要學(xué)好Java開(kāi)發(fā)技術(shù)的小伙伴快快行動(dòng)吧??鄱W(xué)堂Java技術(shù)交流群:850353792。
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入JavaEE/微服務(wù)VIP免費(fèi)公開(kāi)課】
查看更多關(guān)于“Java開(kāi)發(fā)資訊”的相關(guān)文章>>
標(biāo)簽:
Java培訓(xùn)
Java視頻教程
Java多線程
Java面試題
Java學(xué)習(xí)視頻
springBoot項(xiàng)目