一、cookie與session有什么區(qū)別?
1. 由于HTTP協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時,就需要用某種機(jī)制來識具體的用戶,這個機(jī)制就是Session.典型的場景比如購物車,當(dāng)你點擊下單按鈕時,由于HTTP協(xié)議無狀態(tài),所以并不知道是哪個用戶操作的,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的Session,用用于標(biāo)識這個用戶,并且跟蹤用戶,這樣才知道購物車?yán)锩嬗袔妆緯?。這個Session是保存在服務(wù)端的,有一個唯一標(biāo)識。在服務(wù)端保存Session的方法很多,內(nèi)存、數(shù)據(jù)庫、文件都有。集群的時候也要考慮Session的轉(zhuǎn)移,在大型的網(wǎng)站,一般會有專門的Session服務(wù)器集群,用來保存用戶會話,這個時候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類的來放 Session。
2. 思考一下服務(wù)端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實際上大多數(shù)的應(yīng)用都是用 Cookie 來實現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時候,服務(wù)端會在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個Session ID,以后每次請求把這個會話ID發(fā)送到服務(wù)器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會使用一種叫做URL重寫的技術(shù)來進(jìn)行會話跟蹤,即每次HTTP交互,URL后面都會被附加上一個諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識別用戶。
3. Cookie其實還可以用在一些方便用戶的場景下,設(shè)想你某次登陸過一個網(wǎng)站,下次登錄的時候不想再次輸入賬號了,怎么辦?這個信息可以寫到Cookie里面,訪問網(wǎng)站的時候,網(wǎng)站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。所以,總結(jié)一下:Session是在服務(wù)端保存的一個數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實現(xiàn)Session的一種方式。
二、什么是session?
服務(wù)器通過cookie給用戶一個sessionID,
sessionID對應(yīng)服務(wù)器里的一小塊內(nèi)存,
每次用戶訪問服務(wù)器的時候,服務(wù)器就通過sessionID去讀取對應(yīng)的session,來知道用戶的隱私信息
面試的時候怎么回答cookie和session的特點:
三、localStorage是什么?
是html5技術(shù)提供的一個API,
session是服務(wù)器上的哈希表
localStorage的實質(zhì)就是一個哈希表,是瀏覽器上的哈希表
`localStorage.setItem()` 接受兩個參數(shù),可以存一個key、value,只能以字符串的形式存
如果要存一個對象,可以用JSON.stringify進(jìn)行轉(zhuǎn)化
`localStorage.getItem()` 可以獲取值,只接受一個name
`localStorage.clear()` 不接受參數(shù),清空key、value
都是用來操作當(dāng)前頁面里面的哈希表
localStorage不存在與頁面里,它存在C盤的一個文件里
session的缺點就是占內(nèi)存
應(yīng)用:
場景:頁面更新,提示用戶,但是只提醒一次,用戶二次進(jìn)入(刷新)的時候不需要提示
localStroage與sessionStroage的區(qū)別
sessionStroage與session沒有關(guān)系
四、session與Cookie什么關(guān)系
一般來說session是基于Cookie實現(xiàn)的,反過來說cookie是session的基石
以為session必須把sessionID放進(jìn)cookie里再發(fā)送給客戶端
session大部分時間是基于Cookie來存儲ID的,但是它也可以通過查詢參數(shù)和localStroage來存儲它的ID
五、localStroage與Cookie的區(qū)別
cookie每次會帶給服務(wù)器,localStroage不會帶給服務(wù)器,它與HTTP無關(guān)
cookie最大4k,loaclStroage5MB左右
六、了解Cache-Control
HTTP緩存,web優(yōu)化(常識)
將某文件緩存至本地
`response.setHeather(‘Cache-Control’,'max-age=30')`將文件在本地保留30s,刷新不會請求,30s后刷新重新請求,一般`max-age`要設(shè)置久一點例如十年!300000000(闊怕!)
但是,瀏覽器覺得你存那么久也沒啥用,一般一年以后就幫你清了
你問有什么后果嗎?
沒有!反正也沒bug,也就是加載可能慢一點點而已
首頁不會使用使用cache-contorl
如果要升級css或js就在后面加上一個查詢參數(shù)
如`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有什么區(qū)別
Expires設(shè)置的是時間點
Cache-Control設(shè)置的是時間長度
如果同時設(shè)置有限使用Cache-Control
Cache-Control是升級后才有的,10幾年前都是用Expires控制緩存
`Expires: Wed, 21 Oct 2015 07:28:00 GMT`因為他用的本地時間,如果時間錯亂了,那你就完了
七、了解MD5 (訊息摘要算法)
一種被廣泛使用的密碼雜湊函數(shù),可以產(chǎn)生出一個128位元的散列值(hash value),用于確保信息傳輸完整一致
舉個栗子:
假如你在網(wǎng)上下載了一個軟件,有300M,然而你不知道你下載的是不是和它的300M一樣
這時就需要有個MD5,如果你們兩個的MD5值一樣,那么說明你下載的300M===它的300M
文件差異越小,MD5的差異越大
八、了解ETag
用cache-Control是不請求,ETage是直接不下載,但還是有請求,但是響應(yīng)體是空的
打開一個網(wǎng)頁,初次打開會有一個ETag,
以后再打開它的時候請求里有一個if-none-match響應(yīng)頭,后面跟的就是MD5