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