有一朋友做面試官的時(shí)候娃属,曾經(jīng)問(wèn)過(guò)很多朋友這個(gè)問(wèn)題: Cookie 和 Session 有什么區(qū)別呢六荒?大部分的面試者應(yīng)該都可以說(shuō)上一兩句,比如:什么是 Cookie矾端?什么是 Session掏击??jī)烧叩膮^(qū)別等。
但如果再往深入探討的話须床,就慢慢有一些朋友不太了解了铐料,談起原理時(shí)就很少有朋友全部回答準(zhǔn)確。今天和大家一起深入聊聊有關(guān) Cookie 和 Session 的話題 豺旬。
第一層樓
什么是 Cookie 和 Session ?初級(jí)程序員高頻面試題钠惩。
什么是 Cookie
HTTP Cookie(也叫 Web Cookie或?yàn)g覽器 Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上族阅。通常篓跛,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器,如保持用戶的登錄狀態(tài)坦刀。Cookie 使基于無(wú)狀態(tài)的 HTTP 協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能愧沟。
Cookie 主要用于以下三個(gè)方面:
(1)會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)、購(gòu)物車鲤遥、游戲分?jǐn)?shù)或其它需要記錄的信息)
(2)個(gè)性化設(shè)置(如用戶自定義設(shè)置沐寺、主題等)
(3)瀏覽器行為跟蹤(如跟蹤分析用戶行為等)
什么是 Session
Session 代表著服務(wù)器和客戶端一次會(huì)話的過(guò)程。Session 對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息盖奈。這樣混坞,當(dāng)用戶在應(yīng)用程序的 Web 頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在 Session 對(duì)象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去究孕。當(dāng)客戶端關(guān)閉會(huì)話啥酱,或者 Session 超時(shí)失效時(shí)會(huì)話結(jié)束。
第二層樓
Cookie 和 Session 有什么不同厨诸?
(1)作用范圍不同镶殷,Cookie 保存在客戶端(瀏覽器),Session 保存在服務(wù)器端微酬。
(2)存取方式的不同绘趋,Cookie 只能保存 ASCII,Session 可以存任意數(shù)據(jù)類型得封,一般情況下我們可以在 Session 中保持一些常用變量信息埋心,比如說(shuō) UserId 等。
(3)有效期不同忙上,Cookie 可設(shè)置為長(zhǎng)時(shí)間保持拷呆,比如我們經(jīng)常使用的默認(rèn)登錄功能,Session 一般失效時(shí)間較短疫粥,客戶端關(guān)閉或者 Session 超時(shí)都會(huì)失效茬斧。
(4)隱私策略不同,Cookie 存儲(chǔ)在客戶端梗逮,比較容易遭到不法獲取项秉,早期有人將用戶的登錄名和密碼存儲(chǔ)在 Cookie 中導(dǎo)致信息被竊取慷彤;Session 存儲(chǔ)在服務(wù)端娄蔼,安全性相對(duì) Cookie 要好一些。
(5)存儲(chǔ)大小不同底哗, 單個(gè) Cookie 保存的數(shù)據(jù)不能超過(guò) 4K岁诉,Session 可存儲(chǔ)數(shù)據(jù)遠(yuǎn)高于 Cookie。
前兩層樓內(nèi)容跋选,絕大部分同學(xué)都可以準(zhǔn)確回答
小編是一個(gè)有著6年工作經(jīng)驗(yàn)的工程師涕癣,關(guān)于C++,編程前标,自己有做材料的整合坠韩,一個(gè)完整的C++編程學(xué)習(xí)路線,學(xué)習(xí)資料和工具炼列,能夠進(jìn)我的群7253只搁,-91790收取,免費(fèi)送給大家俭尖,希望你也能憑著自己的努力氢惋,成為下一個(gè)優(yōu)秀的程序員
第三層樓
為什么需要 Cookie 和 Session,他們有什么關(guān)聯(lián)?
說(shuō)起來(lái)為什么需要 Cookie 明肮,這就需要從瀏覽器開始說(shuō)起,我們都知道瀏覽器是沒(méi)有狀態(tài)的(HTTP 協(xié)議無(wú)狀態(tài))缭付,這意味著瀏覽器并不知道是張三還是李四在和服務(wù)端打交道柿估。這個(gè)時(shí)候就需要有一個(gè)機(jī)制來(lái)告訴服務(wù)端,本次操作用戶是否登錄陷猫,是哪個(gè)用戶在執(zhí)行的操作秫舌,那這套機(jī)制的實(shí)現(xiàn)就需要 Cookie 和 Session 的配合。
那么 Cookie 和 Session 是如何配合的呢绣檬?我畫了一張圖大家可以先了解下足陨。
用戶第一次請(qǐng)求服務(wù)器的時(shí)候,服務(wù)器根據(jù)用戶提交的相關(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)用戶第二次訪問(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ō)明用戶沒(méi)有登錄或者登錄失效,如果找到 Session 證明用戶已經(jīng)登錄可執(zhí)行后面操作段直。
根據(jù)以上流程可知吃溅,SessionID 是連接 Cookie 和 Session 的一道橋梁,大部分系統(tǒng)也是根據(jù)此原理來(lái)驗(yàn)證用戶登錄狀態(tài)坷牛。
三層樓的內(nèi)容罕偎,大部分同學(xué)可以講清楚。
第四層樓
既然服務(wù)端是根據(jù) Cookie 中的信息判斷用戶是否登錄京闰,那么如果瀏覽器中禁止了 Cookie颜及,如何保障整個(gè)機(jī)制的正常運(yùn)轉(zhuǎn)。
第一種方案蹂楣,每次請(qǐng)求中都攜帶一個(gè) SessionID 的參數(shù)俏站,也可以 Post 的方式提交,也可以在請(qǐng)求的地址后面拼接 xxx?SessionID=123456...痊土。
第二種方案肄扎,Token 機(jī)制。Token 機(jī)制多用于 App 客戶端和服務(wù)器交互的模式,也可以用于 Web 端做用戶狀態(tài)管理犯祠。
Token 的意思是“令牌”旭等,是服務(wù)端生成的一串字符串,作為客戶端進(jìn)行請(qǐng)求的一個(gè)標(biāo)識(shí)衡载。Token 機(jī)制和 Cookie 和 Session 的使用機(jī)制比較類似搔耕。
當(dāng)用戶第一次登錄后,服務(wù)器根據(jù)提交的用戶信息生成一個(gè) Token痰娱,響應(yīng)時(shí)將 Token 返回給客戶端弃榨,以后客戶端只需帶上這個(gè) Token 前來(lái)請(qǐng)求數(shù)據(jù)即可,無(wú)需再次登錄驗(yàn)證梨睁。
四層樓的內(nèi)容鲸睛,一部分同學(xué)可以講清楚。
第五層樓
如何考慮分布式 Session 問(wèn)題坡贺?
在互聯(lián)網(wǎng)公司為了可以支撐更大的流量官辈,后端往往需要多臺(tái)服務(wù)器共同來(lái)支撐前端用戶請(qǐng)求,那如果用戶在 A 服務(wù)器登錄了遍坟,第二次請(qǐng)求跑到服務(wù) B 就會(huì)出現(xiàn)登錄失效問(wèn)題钧萍。
分布式 Session 一般會(huì)有以下幾種解決方案:
(1)Nginx ip_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)象万搔。
(2)Session 復(fù)制,任何一個(gè)服務(wù)器上的 Session 發(fā)生改變(增刪改)官帘,該節(jié)點(diǎn)會(huì)把這個(gè) Session 的所有內(nèi)容序列化瞬雹,然后廣播給所有其它節(jié)點(diǎn)。
(3)共享 Session刽虹,服務(wù)端無(wú)狀態(tài)話酗捌,將用戶的 Session 等信息使用緩存中間件來(lái)統(tǒng)一管理,保障分發(fā)到每一個(gè)服務(wù)器的響應(yīng)結(jié)果都一致涌哲。
建議采用第三種方案胖缤。
第六層樓
如何解決跨域請(qǐng)求?Jsonp 跨域的原理是什么阀圾?
說(shuō)起跨域請(qǐng)求哪廓,必須要了解瀏覽器的同源策略,同源策略/SOP(Same origin policy)是一種約定初烘,由 Netscape 公司 1995年引入瀏覽器涡真,它是瀏覽器最核心也最基本的安全功能分俯,如果缺少了同源策略,瀏覽器很容易受到 XSS哆料、CSFR 等攻擊缸剪。所謂同源是指"協(xié)議+域名+端口"三者相同,即便兩個(gè)不同的域名指向同一個(gè) ip 地址东亦,也非同源橄登。
解決跨域請(qǐng)求的常用方法是:
(1)通過(guò)代理來(lái)避免,比如使用 Nginx 在后端轉(zhuǎn)發(fā)請(qǐng)求讥此,避免了前端出現(xiàn)跨域的問(wèn)題。
(2)通過(guò) Jsonp 跨域
(3)其它跨域解決方案
重點(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ù)娇蛻舳肆恕?/p>
JSONP 的缺點(diǎn)是:它只支持 GET 請(qǐng)求司志,而不支持 POST 請(qǐng)求等其他類型的 HTTP 請(qǐng)求。
以上就是有關(guān) Cookie 和 Session 常見(jiàn)的面試點(diǎn)降宅,不知道有多少同學(xué)可以在面試中準(zhǔn)確回答所有問(wèn)題骂远。希望你面試順利。
私信“01”免費(fèi)獲取C++學(xué)習(xí)教程及軟件