cookies和session

第一層樓

什么是 Cookie 和 Session ?初級(jí)程序員高頻面試題坪创。

什么是 Cookie

HTTP Cookie(也叫 Web Cookie或?yàn)g覽器 Cookie)是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請求時(shí)被攜帶并發(fā)送到服務(wù)器上勒庄。通常挣轨,它用于告知服務(wù)端兩個(gè)請求是否來自同一瀏覽器军熏,如保持用戶的登錄狀態(tài)。Cookie 使基于無狀態(tài)的 HTTP 協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能刃唐。

Cookie 主要用于以下三個(gè)方面:

會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)羞迷、購物車界轩、游戲分?jǐn)?shù)或其它需要記錄的信息)

個(gè)性化設(shè)置(如用戶自定義設(shè)置画饥、主題等)

瀏覽器行為跟蹤(如跟蹤分析用戶行為等)

什么是 Session

Session 代表著服務(wù)器和客戶端一次會(huì)話的過程衔瓮。Session 對象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。這樣抖甘,當(dāng)用戶在應(yīng)用程序的 Web 頁之間跳轉(zhuǎn)時(shí)热鞍,存儲(chǔ)在 Session 對象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去衔彻。當(dāng)客戶端關(guān)閉會(huì)話薇宠,或者 Session 超時(shí)失效時(shí)會(huì)話結(jié)束。

第二層樓

Cookie 和 Session 有什么不同艰额?

作用范圍不同澄港,Cookie 保存在客戶端(瀏覽器),Session 保存在服務(wù)器端柄沮。

存取方式的不同回梧,Cookie 只能保存 ASCII,Session 可以存任意數(shù)據(jù)類型祖搓,一般情況下我們可以在 Session 中保持一些常用變量信息狱意,比如說 UserId 等。

有效期不同拯欧,Cookie 可設(shè)置為長時(shí)間保持详囤,比如我們經(jīng)常使用的默認(rèn)登錄功能,Session 一般失效時(shí)間較短镐作,客戶端關(guān)閉或者 Session 超時(shí)都會(huì)失效藏姐。

隱私策略不同,Cookie 存儲(chǔ)在客戶端该贾,比較容易遭到不法獲取包各,早期有人將用戶的登錄名和密碼存儲(chǔ)在 Cookie 中導(dǎo)致信息被竊取靶庙;Session 存儲(chǔ)在服務(wù)端问畅,安全性相對 Cookie 要好一些。

存儲(chǔ)大小不同六荒, 單個(gè) Cookie 保存的數(shù)據(jù)不能超過 4K护姆,Session 可存儲(chǔ)數(shù)據(jù)遠(yuǎn)高于 Cookie。

前兩層樓內(nèi)容掏击,絕大部分同學(xué)都可以準(zhǔn)確回答

第三層樓

為什么需要 Cookie 和 Session卵皂,他們有什么關(guān)聯(lián)?

說起來為什么需要 Cookie 砚亭,這就需要從瀏覽器開始說起灯变,我們都知道瀏覽器是沒有狀態(tài)的(HTTP 協(xié)議無狀態(tài))殴玛,這意味著瀏覽器并不知道是張三還是李四在和服務(wù)端打交道。這個(gè)時(shí)候就需要有一個(gè)機(jī)制來告訴服務(wù)端添祸,本次操作用戶是否登錄滚粟,是哪個(gè)用戶在執(zhí)行的操作,那這套機(jī)制的實(shí)現(xiàn)就需要 Cookie 和 Session 的配合刃泌。

那么 Cookie 和 Session 是如何配合的呢凡壤?我畫了一張圖大家可以先了解下。

用戶第一次請求服務(wù)器的時(shí)候耙替,服務(wù)器根據(jù)用戶提交的相關(guān)信息亚侠,創(chuàng)建創(chuàng)建對應(yīng)的 Session ,請求返回時(shí)將此 Session 的唯一標(biāo)識(shí)信息 SessionID 返回給瀏覽器俗扇,瀏覽器接收到服務(wù)器返回的 SessionID 信息后硝烂,會(huì)將此信息存入到 Cookie 中,同時(shí) Cookie 記錄此 SessionID 屬于哪個(gè)域名铜幽。

當(dāng)用戶第二次訪問服務(wù)器的時(shí)候滞谢,請求會(huì)自動(dòng)判斷此域名下是否存在 Cookie 信息,如果存在自動(dòng)將 Cookie 信息也發(fā)送給服務(wù)端啥酱,服務(wù)端會(huì)從 Cookie 中獲取 SessionID爹凹,再根據(jù) SessionID 查找對應(yīng)的 Session 信息,如果沒有找到說明用戶沒有登錄或者登錄失效镶殷,如果找到 Session 證明用戶已經(jīng)登錄可執(zhí)行后面操作禾酱。

根據(jù)以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋梁绘趋,大部分系統(tǒng)也是根據(jù)此原理來驗(yàn)證用戶登錄狀態(tài)颤陶。

三層樓的內(nèi)容,大部分同學(xué)可以講清楚陷遮。

第四層樓

既然服務(wù)端是根據(jù) Cookie 中的信息判斷用戶是否登錄滓走,那么如果瀏覽器中禁止了 Cookie,如何保障整個(gè)機(jī)制的正常運(yùn)轉(zhuǎn)帽馋。

第一種方案搅方,每次請求中都攜帶一個(gè) SessionID 的參數(shù),也可以 Post 的方式提交绽族,也可以在請求的地址后面拼接 xxx?SessionID=123456...姨涡。

第二種方案,Token 機(jī)制吧慢。Token 機(jī)制多用于 App 客戶端和服務(wù)器交互的模式涛漂,也可以用于 Web 端做用戶狀態(tài)管理。

Token 的意思是“令牌”,是服務(wù)端生成的一串字符串匈仗,作為客戶端進(jìn)行請求的一個(gè)標(biāo)識(shí)瓢剿。Token 機(jī)制和 Cookie 和 Session 的使用機(jī)制比較類似。

當(dāng)用戶第一次登錄后悠轩,服務(wù)器根據(jù)提交的用戶信息生成一個(gè) Token间狂,響應(yīng)時(shí)將 Token 返回給客戶端,以后客戶端只需帶上這個(gè) Token 前來請求數(shù)據(jù)即可哗蜈,無需再次登錄驗(yàn)證前标。

四層樓的內(nèi)容坠韩,一部分同學(xué)可以講清楚距潘。

第五層樓

如何考慮分布式 Session 問題?

在互聯(lián)網(wǎng)公司為了可以支撐更大的流量只搁,后端往往需要多臺(tái)服務(wù)器共同來支撐前端用戶請求音比,那如果用戶在 A 服務(wù)器登錄了,第二次請求跑到服務(wù) B 就會(huì)出現(xiàn)登錄失效問題氢惋。

分布式 Session 一般會(huì)有以下幾種解決方案:

Nginx ip_hash 策略洞翩,服務(wù)端使用 Nginx 代理,每個(gè)請求按訪問 IP 的 hash 分配焰望,這樣來自同一 IP 固定訪問一個(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ù)端無狀態(tài)話传趾,將用戶的 Session 等信息使用緩存中間件來統(tǒng)一管理迎膜,保障分發(fā)到每一個(gè)服務(wù)器的響應(yīng)結(jié)果都一致。

建議采用第三種方案浆兰。

第六層樓

如何解決跨域請求磕仅?Jsonp 跨域的原理是什么?

說起跨域請求簸呈,必須要了解瀏覽器的同源策略榕订,同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995年引入瀏覽器蝶棋,它是瀏覽器最核心也最基本的安全功能卸亮,如果缺少了同源策略,瀏覽器很容易受到 XSS玩裙、CSFR 等攻擊兼贸。所謂同源是指"協(xié)議+域名+端口"三者相同段直,即便兩個(gè)不同的域名指向同一個(gè) ip 地址,也非同源溶诞。

解決跨域請求的常用方法是:

通過代理來避免鸯檬,比如使用 Nginx 在后端轉(zhuǎn)發(fā)請求,避免了前端出現(xiàn)跨域的問題螺垢。

通過 Jsonp 跨域

其它跨域解決方案

重點(diǎn)談一下 Jsonp 跨域原理喧务。瀏覽器的同源策略把跨域請求都禁止了,但是頁面中的 <script><img><iframe>標(biāo)簽是例外枉圃,不受同源策略限制功茴。Jsonp 就是利用 <script>標(biāo)簽跨域特性進(jìn)行跨域數(shù)據(jù)訪問。

JSONP 的理念就是孽亲,與服務(wù)端約定好一個(gè)回調(diào)函數(shù)名坎穿,服務(wù)端接收到請求后,將返回一段 Javascript返劲,在這段 Javascript 代碼中調(diào)用了約定好的回調(diào)函數(shù)玲昧,并且將數(shù)據(jù)作為參數(shù)進(jìn)行傳遞。當(dāng)網(wǎng)頁接收到這段 Javascript 代碼后篮绿,就會(huì)執(zhí)行這個(gè)回調(diào)函數(shù)孵延,這時(shí)數(shù)據(jù)已經(jīng)成功傳輸?shù)娇蛻舳肆恕?/p>

JSONP 的缺點(diǎn)是:它只支持 GET 請求,而不支持 POST 請求等其他類型的 HTTP 請求亲配。

以上就是有關(guān) Cookie 和 Session 常見的面試點(diǎn)尘应,不知道有多少同學(xué)可以在面試中準(zhǔn)確回答所有問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弃榨,一起剝皮案震驚了整個(gè)濱河市菩收,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲸睛,老刑警劉巖娜饵,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異官辈,居然都是意外死亡箱舞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門拳亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晴股,“玉大人,你說我怎么就攤上這事肺魁〉缦妫” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂呛。 經(jīng)常有香客問我怎诫,道長,這世上最難降的妖魔是什么贷痪? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任幻妓,我火速辦了婚禮,結(jié)果婚禮上劫拢,老公的妹妹穿的比我還像新娘肉津。我一直安慰自己,他們只是感情好舱沧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布妹沙。 她就那樣靜靜地躺著,像睡著了一般狗唉。 火紅的嫁衣襯著肌膚如雪初烘。 梳的紋絲不亂的頭發(fā)上涡真,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天分俯,我揣著相機(jī)與錄音,去河邊找鬼哆料。 笑死缸剪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的东亦。 我是一名探鬼主播杏节,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼典阵!你這毒婦竟也來了奋渔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤壮啊,失蹤者是張志新(化名)和其女友劉穎嫉鲸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹啼,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玄渗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狸眼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藤树。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拓萌,靈堂內(nèi)的尸體忽然破棺而出岁钓,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布屡限,位于F島的核電站降宅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏囚霸。R本人自食惡果不足惜腰根,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拓型。 院中可真熱鬧额嘿,春花似錦、人聲如沸劣挫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽压固。三九已至球拦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帐我,已是汗流浹背坎炼。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拦键,地道東北人谣光。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像芬为,于是被迫代替她去往敵國和親萄金。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù)媚朦,用來跟蹤用戶的整個(gè)會(huì)話氧敢。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,617評(píng)論 1 49
  • 作者:晚晴幽草軒www.jeffjade.com/2016/10/31/115-summary-of-cookie...
    饑人谷_Dylan閱讀 1,224評(píng)論 0 51
  • 背景在HTTP協(xié)議的定義中蕊温,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息惰许,這種機(jī)制被稱為cookie,cooki...
    時(shí)芥藍(lán)閱讀 2,364評(píng)論 1 17
  • 注:本文轉(zhuǎn)載自前端大全 背景 在HTTP協(xié)議的定義中途茫,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息瑞侮,這種機(jī)制被稱...
    楠小忎閱讀 673評(píng)論 0 0
  • 窗外有幾棵楊樹半火,樹上有幾個(gè)鳥窩越妈。 黎明時(shí)分,那些鳥兒便有了動(dòng)靜钮糖。悉悉索索地梅掠,應(yīng)該是抖動(dòng)翅膀酌住,抑或搖擺腦袋。 一只年...
    lv綠閱讀 1,378評(píng)論 0 2