cookie 與 session 有什麼區別?
由於 HTTP 協議是無狀態的協議,所以服務端需要記錄用户的狀態時,就需要用某種機制來識具體的用户,這個機制就是 Session. 典型的場景比如購物車,當你點擊下單按鈕時,由於 HTTP 協議無狀態,所以並不知道是哪個用户操作的,所以服務端要為特定的用户創建了特定的 Session,用用於標識這個用户,並且跟蹤用户,這樣才知道購物車裏面有幾本書。這個 Session 是保存在服務端的,有一個唯一標識。在服務端保存 Session 的方法很多,內存、數據庫、文件都有。集羣的時候也要考慮 Session 的轉移,在大型的網站,一般會有專門的 Session 服務器集羣,用來保存用户會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如 Memcached 之類的來放 Session。
思考一下服務端如何識別特定的客户?這個時候 Cookie 就登場了。每次 HTTP 請求的時候,客户端都會發送相應的 Cookie 信息到服務端。實際上大多數的應用都是用 Cookie 來實現 Session 跟蹤的,第一次創建 Session 的時候,服務端會在 HTTP 協議中告訴客户端,需要在 Cookie 裏面記錄一個 Session ID,以後每次請求把這個會話 ID 發送到服務器,我就知道你是誰了。有人問,如果客户端的瀏覽器禁用了 Cookie 怎麼辦?一般這種情況下,會使用一種叫做 URL 重寫的技術來進行會話跟蹤,即每次 HTTP 交互,URL 後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用户。
Cookie 其實還可以用在一些方便用户的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎麼辦?這個信息可以寫到 Cookie 裏面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用户名給填了,能夠方便一下用户。這也是 Cookie 名稱的由來,給用户的一點甜頭。所以,總結一下:Session 是在服務端保存的一個數據結構,用來跟蹤用户的狀態,這個數據可以保存在集羣、數據庫、文件中;Cookie 是客户端保存用户信息的一種機制,用來記錄用户的一些信息,也是實現 Session 的一種方式。
什麼是 session?
服務器通過 cookie 給用户一個 sessionID,
sessionID 對應服務器裏的一小塊內存,
每次用户訪問服務器的時候,服務器就通過 sessionID 去讀取對應的 session,來知道用户的隱私信息
面試的時候怎麼回答 cookie 和 session 的特點:
localStorage 是什麼?
是 html5 技術提供的一個 API,
session 是服務器上的哈希表
localStorage 的實質就是一個哈希表,是瀏覽器上的哈希表
localStorage.setItem () 接受兩個參數,可以存一個 key、value,只能以字符串的形式存
如果要存一個對象,可以用 JSON.stringify 進行轉化
localStorage.getItem () 可以獲取值,只接受一個 name
localStorage.clear () 不接受參數,清空 key、value
都是用來操作當前頁面裏面的哈希表
localStorage 不存在與頁面裏,它存在 C 盤的一個文件裏
session 的缺點就是佔內存
應用:
場景:頁面更新,提示用户,但是隻提醒一次,用户二次進入(刷新)的時候不需要提示
localStroage 與 sessionStroage 的區別
sessionStroage 與 session 沒有關係
session 與 Cookie 什麼關係
一般來説 session 是基於 Cookie 實現的,反過來説 cookie 是 session 的基石
以為 session 必須把 sessionID 放進 cookie 裏再發送給客户端
session 大部分時間是基於 Cookie 來存儲 ID 的,但是它也可以通過查詢參數和 localStroage 來存儲它的 ID
localStroage 與 Cookie 的區別
cookie 每次會帶給服務器,localStroage 不會帶給服務器,它與 HTTP 無關
cookie 最大 4k,loaclStroage5MB 左右
瞭解 Cache-Control
HTTP 緩存,web 優化(常識)
將某文件緩存至本地
response.setHeather (‘Cache-Control’,'max-age=30') 將文件在本地保留 30s,刷新不會請求,30s 後刷新重新請求,一般 max-age 要設置久一點例如十年!300000000(闊怕!)
但是,瀏覽器覺得你存那麼久也沒啥用,一般一年以後就幫你清了
你問有什麼後果嗎?
沒有!反正也沒 bug,也就是加載可能慢一點點而已
首頁不會使用使用 cache-contorl
如果要升級 css 或 js 就在後面加上一個查詢參數
如 https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js
更新後:https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js?v=2 這樣的話 max-age=30' 就會失效
- Expires 和 Cache-Control 有什麼區別
Expires 設置的是時間點
Cache-Control 設置的是時間長度
如果同時設置有限使用 Cache-Control
Cache-Control 是升級後才有的,10 幾年前都是用 Expires 控制緩存
Expires: Wed, 21 Oct 2015 07:28:00 GMT 因為他用的本地時間,如果時間錯亂了,那你就完了
瞭解 MD5 (訊息摘要算法)
一種被廣泛使用的密碼雜湊函數,可以產生出一個 128 位元的散列值(hash value),用於確保信息傳輸完整一致
舉個栗子:
假如你在網上下載了一個軟件,有 300M,然而你不知道你下載的是不是和它的 300M 一樣
這時就需要有個 MD5,如果你們兩個的 MD5 值一樣,那麼説明你下載的 300M=== 它的 300M
文件差異越小,MD5 的差異越大
瞭解 ETag
用 cache-Control 是不請求,ETage 是直接不下載,但還是有請求,但是響應體是空的
打開一個網頁,初次打開會有一個 ETag,
以後再打開它的時候請求裏有一個 if-none-match 響應頭,後面跟的就是 MD5
源碼附件已經打包好上傳到百度雲了,大家自行下載即可~
鏈接: https://pan.baidu.com/s/14G-b...
提取碼: yu27
百度雲鏈接不穩定,隨時可能會失效,大家抓緊保存哈。
如果百度雲鏈接失效了的話,請留言告訴我,我看到後會及時更新~
開源地址
碼雲地址:
http://github.crmeb.net/u/defu
Github 地址:
http://github.crmeb.net/u/defu