本文目錄:
- 1.簡(jiǎn)述下cookie,session,localstorage,sessionstorage的區(qū)別
- 2.談下cookie的弊端
- 3.怎么禁止JS訪問(wèn)cookie
- 4.cookie有哪些屬性
- 5.線程和進(jìn)程的區(qū)別
- 6.DoS攻擊?CSRF?XSS?SQL注入?
- 7.瀏覽器的機(jī)制你了解多少
- 8.v8引擎 如何執(zhí)行 js 代碼
- 9.前端常用的設(shè)計(jì)模式
- 10.前端數(shù)據(jù)結(jié)構(gòu)與算法
- 11.說(shuō)下緩存及實(shí)現(xiàn)方式
- 12.為什么第二次打開(kāi)某個(gè)網(wǎng)頁(yè)會(huì)比首次打開(kāi)速度快很多
1.簡(jiǎn)述下cookie,session,localstorage,sessionstorage的區(qū)別
1.cookie數(shù)據(jù)始終在同源的http請(qǐng)求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來(lái)回傳遞。而sessionStorage和localStorage不會(huì)自動(dòng)把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存。
2.存儲(chǔ)大小限制也不同,cookie數(shù)據(jù)不能超過(guò)4k,同時(shí)因?yàn)槊看蝖ttp同源請(qǐng)求都會(huì)攜帶cookie,所以cookie只適合保存很小的數(shù)據(jù),如會(huì)話標(biāo)識(shí)。sessionStorage和localStorage 雖然也有存儲(chǔ)大小的限制,但比cookie大得多,可以達(dá)到5M或更大。
3.生命周期不同,sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持;localStorage:始終有效,窗口或?yàn)g覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過(guò)期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉。
4.作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁(yè)面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
5.Web Storage支持事件通知機(jī)制,可以將數(shù)據(jù)更新的通知發(fā)送給監(jiān)聽(tīng)者。Web Storage的 api 接口使用更方便。Web Storage存儲(chǔ)的都是字符串類型的數(shù)據(jù),Web Storage的核心方法
- 設(shè)置值setItem("key","value")
- 獲取值getItem("key")
- 刪除值removeItem("key")
- 清空clear()
而cookie我們?cè)陧?xiàng)目開(kāi)發(fā)中,會(huì)對(duì)其進(jìn)行二次封裝。
2.談下cookie的弊端
a. 每個(gè)特定的域名下最多生成的cookie個(gè)數(shù)有限制
b. IE和Opera會(huì)清理近期最少使用的cookie,F(xiàn)irefox會(huì)隨機(jī)清理cookie
c. cookie的最大大約為4096字節(jié),為了兼容性,一般不能超過(guò)4095字節(jié)
d. 安全性問(wèn)題。如果cookie被人攔截了,那人就可以取得所有的session信息。
3.怎么禁止JS訪問(wèn)cookie
通過(guò)JS
document.cookie = name+"="+value+expires+"; domain=my.domain.com; path=/; HttpOnly;";
服務(wù)端進(jìn)行設(shè)置
response.setHeader("Set-Cookie", "cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
設(shè)置完之后使用JS腳本是讀取不到該cookie的
注意:將cookie設(shè)置成HttpOnly是為了防止XSS攻擊,竊取cookie內(nèi)容,這樣就增加了cookie的安全性,即便是這樣,也不要將重要信息存入cookie。
4.cookie有哪些屬性
name字段:一個(gè)cookie的名稱
value字段:一個(gè)cookie的值
domain字段:可以訪問(wèn)此cookie的域名
path字段:可以訪問(wèn)此cookie的頁(yè)面路徑
Size字段:此cookie大小
http字段:cookie的httponly屬性,若此屬性為True,則只有在http請(qǐng)求頭中會(huì)有此cookie信息,而不能通過(guò)document.cookie來(lái)訪問(wèn)此cookie。
secure字段:設(shè)置是否只能通過(guò)https來(lái)傳遞此條cookie。
expires/Max-Age字段:設(shè)置cookie超時(shí)時(shí)間。如果設(shè)置的值為一個(gè)時(shí)間,則當(dāng)?shù)竭_(dá)該時(shí)間時(shí)此cookie失效。不設(shè)置的話默認(rèn)是session,意思是cookie會(huì)和session一起失效,當(dāng)瀏覽器關(guān)閉(并不是瀏覽器標(biāo)簽關(guān)閉,而是整個(gè)瀏覽器關(guān)閉)后,cookie失效。
5.線程和進(jìn)程的區(qū)別
進(jìn)程:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程間的切換會(huì)有較大的開(kāi)銷,一個(gè)進(jìn)程包含1--n個(gè)線程。(進(jìn)程是資源分配的最小單位)
線程:同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程切換開(kāi)銷小。(線程是cpu調(diào)度的最小單位)
強(qiáng)調(diào)一點(diǎn):一個(gè)軟件不等于一個(gè)進(jìn)程,一個(gè)軟件可能包含有多個(gè)互相獨(dú)立的進(jìn)程。
6.DoS攻擊?CSRF?XSS?SQL注入?
DoS攻擊
DoS(Denial of Service),拒絕服務(wù),顧名思義這種攻擊是為了讓服務(wù)器無(wú)法提供正常服務(wù),最常見(jiàn)的DoS攻擊是網(wǎng)絡(luò)帶寬攻擊和連通性攻擊。帶寬攻擊指以極大的通信量沖擊網(wǎng)絡(luò),使得所有可用網(wǎng)絡(luò)資源都被消耗殆盡,最后導(dǎo)致合法的用戶請(qǐng)求無(wú)法通過(guò)。連通性攻擊指用大量的連接請(qǐng)求沖擊計(jì)算機(jī),使得所有可用的操作系統(tǒng)資源都被消耗殆盡,最終計(jì)算機(jī)無(wú)法再處理合法用戶的請(qǐng)求。
CSRF攻擊
CSRF(Cross Site Request Forgery)攻擊,即跨站請(qǐng)求偽造,是一種常見(jiàn)的Web攻擊。
攻擊者可以盜用我們的登陸信息,以我們的身份模擬發(fā)送各種請(qǐng)求。例如:我們正常打開(kāi)一個(gè)網(wǎng)站,輸入賬號(hào)密碼登陸,此時(shí)服務(wù)器會(huì)返回一個(gè)cookie,瀏覽器將其保存在本地來(lái)識(shí)別身份信息。這時(shí)如果我們不小心打開(kāi)了一個(gè)釣魚網(wǎng)站,這個(gè)釣魚網(wǎng)站就可以帶著cookie冒充我們?yōu)樗麨椤w根結(jié)底是源于Web的隱式身份驗(yàn)證,Web的身份驗(yàn)證機(jī)制雖然可以保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶的瀏覽器,但卻無(wú)法保證該請(qǐng)求是用戶批準(zhǔn)發(fā)送的。
XSS漏洞
XSS(Cross Site Scripting),跨站腳本攻擊,為了與層疊樣式表(一般意義上的CSS)區(qū)別開(kāi),將其縮寫為XSS。XSS的原理是黑客向Web頁(yè)面里插入惡意可執(zhí)行網(wǎng)頁(yè)腳本代碼,當(dāng)用戶瀏覽該頁(yè)之時(shí),嵌入其中Web里面的腳本代碼會(huì)被執(zhí)行,從而可以達(dá)到黑客盜取用戶信息或其他侵犯用戶安全隱私的目的。XSS漏洞主要分為持久型XSS漏洞和非持久性XSS漏洞。
SQL注入
SQL注入即是指web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒(méi)有判斷或過(guò)濾不嚴(yán),攻擊者可以在web應(yīng)用程序中事先定義好的查詢語(yǔ)句的結(jié)尾上添加額外的SQL語(yǔ)句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來(lái)實(shí)現(xiàn)欺騙數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行非授權(quán)的任意查詢,從而進(jìn)一步得到相應(yīng)的數(shù)據(jù)信息。
7.瀏覽器的機(jī)制你了解多少
進(jìn)程與線程:
首先,明確的是:瀏覽器是多進(jìn)程的。瀏覽器的進(jìn)程主要包括以下幾種:
1.Browser進(jìn)程:瀏覽器的主進(jìn)程(負(fù)責(zé)協(xié)調(diào),主控)
2.第三方插件進(jìn)程:每種類型的插件對(duì)應(yīng)一個(gè)進(jìn)程,僅當(dāng)使用該插件時(shí)才創(chuàng)建
3.GPU進(jìn)程:最多一個(gè),用于3D繪制
4.瀏覽器渲染進(jìn)程(內(nèi)核):默認(rèn)每個(gè)Tab頁(yè)面一個(gè)進(jìn)程,互不影響,控制頁(yè)面渲染,腳本執(zhí)行,事件處理等(有時(shí)候會(huì)優(yōu)化,如多個(gè)空白tab會(huì)合并成一個(gè)進(jìn)程)
多進(jìn)程瀏覽器的優(yōu)點(diǎn)
避免頁(yè)面渲染影響整個(gè)瀏覽器
避免第三方插件影響整個(gè)瀏覽器
多進(jìn)程充分利用多核優(yōu)勢(shì)
方便使用沙盒模型隔離插件等進(jìn)程,提高瀏覽器穩(wěn)定性
瀏覽器的渲染進(jìn)程(瀏覽器內(nèi)核),是多線程的,主要以下幾大類:
1.GUI線程
負(fù)責(zé)渲染瀏覽器界面HTML元素,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線程就會(huì)執(zhí)行。在Javascript引擎運(yùn)行腳本期間,GUI渲染線程都是處于掛起狀態(tài)的,也就是說(shuō)被”凍結(jié)”了.
2.Javascript引擎線程
也可以稱為JS內(nèi)核,主要負(fù)責(zé)處理Javascript腳本程序,例如V8引擎。Javascript引擎線程理所當(dāng)然是負(fù)責(zé)解析Javascript腳本,運(yùn)行代碼。Javascript是單線程的,GUI 渲染線程 與 JavaScript引擎線程互斥!所以JS會(huì)阻塞頁(yè)面加載。
3.事件觸發(fā)線程
4.定時(shí)器線程
5.網(wǎng)絡(luò)請(qǐng)求線程
事件循環(huán)機(jī)制
事件循環(huán)機(jī)制的核心是事件觸發(fā)線程,由于執(zhí)行棧產(chǎn)生異步任務(wù),異步任務(wù)完成后事件觸發(fā)線程將其回調(diào)函數(shù)傳入到任務(wù)隊(duì)列中,當(dāng)執(zhí)行棧為空,任務(wù)隊(duì)列將隊(duì)列頭的回調(diào)函數(shù)入執(zhí)行棧,從而新的一輪循環(huán)開(kāi)始。這就是稱為循環(huán)的原因。
導(dǎo)致頁(yè)面無(wú)法立即響應(yīng)的原因
導(dǎo)致頁(yè)面無(wú)法響應(yīng)的原因是執(zhí)行棧中還有任務(wù)未執(zhí)行完,或者是js引擎線程被GUI線程堵塞。
html文件解析過(guò)程
這個(gè)過(guò)程是在下載html文件之后,不包括網(wǎng)絡(luò)請(qǐng)求過(guò)程
- Browser進(jìn)程下載html文件并將文件發(fā)送給renderer進(jìn)程
- renderer進(jìn)程的GUI進(jìn)程開(kāi)始解析html文件來(lái)構(gòu)建出DOM
- 當(dāng)遇到外源css時(shí),Browser進(jìn)程下載該css文件并發(fā)送回來(lái),GUI線程再解析該文件,在這同時(shí),html的解析也同時(shí)進(jìn)行,但不會(huì)渲染(還未形成渲染樹(shù))
- 當(dāng)遇到內(nèi)部css時(shí),html的解析和css的解析同時(shí)進(jìn)行
- 繼續(xù)解析html文件,當(dāng)遇到外源js時(shí),Browser進(jìn)程下載該js文件并發(fā)送回來(lái),此時(shí),js引擎線程解析并執(zhí)行js,因?yàn)镚UI線程和js引擎線程互斥,所以GUI線程被掛起,停止繼續(xù)解析html。直到j(luò)s引擎線程空閑,GUI線程繼續(xù)解析html。
- 遇到內(nèi)部js也是同理
- 解析完html文件,形成了完整的DOM樹(shù),也解析完了css,形成了完整的CSSOM樹(shù),兩者結(jié)合形成了render樹(shù)
- 根據(jù)render樹(shù)來(lái)進(jìn)行布局,若在布局的過(guò)程中發(fā)生了元素尺寸、位置、隱藏的變化或增加、刪除元素時(shí),則進(jìn)行回流,修改
- 根據(jù)render樹(shù)進(jìn)行繪制,若在布局的過(guò)程中元素的外觀發(fā)生變換,則進(jìn)行重繪
- 將布局、繪制得到的各個(gè)簡(jiǎn)單圖層的位圖發(fā)送給Browser進(jìn)程,由它來(lái)合并簡(jiǎn)單圖層為復(fù)合圖層,從而顯示到頁(yè)面上
- 以上步驟就是html文件解析全過(guò)程,完成之后,如若當(dāng)頁(yè)面有元素的尺寸、大小、隱藏有變化時(shí),重新布局計(jì)算回流,并修改頁(yè)面中所有受影響的部分,如若當(dāng)頁(yè)面有元素的外觀發(fā)生變化時(shí),重繪。
8.v8引擎 如何執(zhí)行 js 代碼
主要核心流程分為兩步 – 編譯 和 執(zhí)行
- 首先將JavaScript代碼轉(zhuǎn)換為低級(jí)中間代碼或者機(jī)器能夠理解的機(jī)器代碼,CPU只能識(shí)別機(jī)器代碼,CPU不能直接識(shí)別匯編語(yǔ)言
- 執(zhí)行轉(zhuǎn)換后的代碼并輸出執(zhí)行結(jié)果
V8執(zhí)行JS代碼的具體流程 - 執(zhí)行之前,準(zhǔn)備所需的基礎(chǔ)環(huán)境
在 V8 啟動(dòng)執(zhí)行 JavaScript 之前,它還需要準(zhǔn)備執(zhí)行 JavaScript 時(shí)所需要的一些基礎(chǔ)環(huán)境,這些基礎(chǔ)環(huán)境包括了 堆空間、棧空間、全局執(zhí)行上下文、全局作用域、消息循環(huán)系統(tǒng)、內(nèi)置函數(shù) 等,這些內(nèi)容都是在執(zhí)行 JavaScript 過(guò)程中需要使用到的。
2.準(zhǔn)備好基礎(chǔ)環(huán)境,向V8提交要執(zhí)行的JS代碼‘
首先,V8 會(huì)接收到要執(zhí)行的 JavaScript 源代碼,不過(guò)這對(duì) V8 來(lái)說(shuō)只是一堆 字符串,V8 并不能直接理解這段字符串的含義,它需要 結(jié)構(gòu)化 這段字符串
3.結(jié)構(gòu)化字符串(JS源代碼)
結(jié)構(gòu)化,是指信息經(jīng)過(guò)分析后可 分解成多個(gè)互相關(guān)聯(lián)的組成部分。各組成部分間有明確的層次結(jié)構(gòu),方便使用和維護(hù),并有一定的操作規(guī)范;
4.生成AST、作用域
結(jié)構(gòu)化之后,就生成了 抽象語(yǔ)法樹(shù)(AST),AST 是便于 V8 理解的結(jié)構(gòu);在生成 AST 的同時(shí),V8 還會(huì) 生成相關(guān)的作用域,作用域中存放相關(guān)變量;
5.生成字節(jié)碼
有了 AST 和 作用域 之后,接下來(lái)就可以生成 字節(jié)碼 了,字節(jié)碼是介于 AST 和 機(jī)器代碼 的中間代碼。但是與特定類型的機(jī)器代碼無(wú)關(guān),解釋器可以直接解釋執(zhí)行字節(jié)碼 ,或者通過(guò)編譯器將其編譯為二進(jìn)制的機(jī)器代碼再執(zhí)行; - 解釋器解釋執(zhí)行字節(jié)碼
生成字節(jié)碼之后,解釋器就登場(chǎng)了,它會(huì) 按照順序 解釋執(zhí)行字節(jié)碼,并輸出執(zhí)行結(jié)果;
9.前端常用的設(shè)計(jì)模式
單例模式
觀察者模式
工廠模式
命令模式
職責(zé)鏈模式
具體待以后再進(jìn)行學(xué)習(xí)
10.前端數(shù)據(jù)結(jié)構(gòu)與算法
初級(jí)前端的關(guān)注點(diǎn)就是寫寫頁(yè)面,綁定事件,然后發(fā)后臺(tái)發(fā)發(fā)請(qǐng)求拿數(shù)據(jù),但是如果打算走全棧路線,用node做后臺(tái)開(kāi)發(fā)或者有志于做一個(gè)高級(jí)前端程序員,那么數(shù)據(jù)結(jié)構(gòu)與算法是一定要掌握的。
先來(lái)看看js數(shù)據(jù)類型
基本類型(棧 stack) : Number、String 、Boolean、Null 和 Undefined , Symbol(es6 新增); 基本數(shù)據(jù)類型是按值訪問(wèn) 由高向低分配,棧內(nèi)存最大是 8MB,(超出報(bào)棧溢出), String:是特殊的棧內(nèi)存 (向高分配大小不定),程序員分配
引用類型(堆 heap) :Object 、Array 、Function 、Data;引用類型數(shù)據(jù)在棧內(nèi)存中保存的實(shí)際上是對(duì)象在堆內(nèi)存中的引用地址(指針),向高分配,系統(tǒng)自動(dòng)分配
具體待以后再進(jìn)行學(xué)習(xí)
11.說(shuō)下緩存及實(shí)現(xiàn)方式
前端緩存主要分為瀏覽器緩存和HTTP緩存。
瀏覽器的緩存方式有Cookie,LocalStorage和SessionStorage。
HTTP緩存分為強(qiáng)制緩存和協(xié)商緩存。
對(duì)于強(qiáng)制緩存,響應(yīng)header中會(huì)有兩個(gè)字段來(lái)標(biāo)明失效規(guī)則(Expires/Cache-Control),服務(wù)器通知瀏覽器一個(gè)緩存時(shí)間,在緩存時(shí)間內(nèi),下次請(qǐng)求,直接用緩存,不在時(shí)間內(nèi),執(zhí)行比較緩存策略。
Expires
Expires:Thu, 21 Jan 2020 23:29:02 GMT
Cache-Control
Cache-Control:max-age=3600
Cache-Control的出現(xiàn),是為了克服Expires的時(shí)間客戶端和服務(wù)端不一致的缺點(diǎn)(絕對(duì)時(shí)間),上面代碼中的Cache-Control直接就規(guī)定了該資源有效期為3600秒(相同時(shí)間),規(guī)定時(shí)間內(nèi)瀏覽器不會(huì)再發(fā)送此次的相同的請(qǐng)求
對(duì)于協(xié)商緩存,將緩存信息中的Etag和Last-Modified通過(guò)請(qǐng)求發(fā)送給服務(wù)器,由服務(wù)器校驗(yàn),返回304狀態(tài)碼時(shí),瀏覽器直接使用緩存。
Last-Modified: Wed, 26 Jan 2020 00:35:11 GMT
Cache-Control優(yōu)先級(jí)高于Expires,Etag優(yōu)先級(jí)高于Last-Modified/If-Modified-Since。
HTTP緩存的流程:
(1)先根據(jù)這個(gè)資源的http header判斷它是否命中強(qiáng)緩存,如果命中,則直接從本地緩存中獲取資源,不中則向服務(wù)器請(qǐng)求資源。
(2)當(dāng)強(qiáng)緩存沒(méi)有命中時(shí),客戶端會(huì)發(fā)送請(qǐng)求到服務(wù)器,服務(wù)器通過(guò)另一些request header驗(yàn)證這個(gè)資源是否命中協(xié)商緩存,這個(gè)過(guò)程成為http再驗(yàn)證,如果命中,服務(wù)器直接返回請(qǐng)求而不返回資源,而是告訴客戶端之間從緩存中獲取,客戶端收到返回后就直接從客戶端獲取資源
(3)強(qiáng)緩存和協(xié)商緩存的共同之處在于:如果命中緩存,服務(wù)器不會(huì)返回資源;區(qū)別是:強(qiáng)緩存不發(fā)送請(qǐng)求打服務(wù)器,但是協(xié)商緩存會(huì)發(fā)送請(qǐng)求到服務(wù)器
(4)當(dāng)協(xié)商緩存沒(méi)有命中時(shí),服務(wù)器會(huì)返回資源給客戶端
(5)當(dāng)ctrl+F5強(qiáng)制刷新網(wǎng)頁(yè)時(shí),直接從服務(wù)器加載,跳過(guò)強(qiáng)緩存和協(xié)商緩存
(6)當(dāng)F5刷新頁(yè)面時(shí),跳過(guò)強(qiáng)緩存但會(huì)檢查協(xié)商緩存
強(qiáng)緩存是利用http的返回頭中的Expires或者Cache-Control兩個(gè)字段來(lái)控制的,用來(lái)表示資源的緩存時(shí)間。
Expires該字段是http1.0時(shí)的規(guī)范,值是一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串,代表緩存的過(guò)期時(shí)間
Cache-Control:max-age該字段是http1.1的規(guī)范強(qiáng)緩存利用的是max-age的值來(lái)實(shí)現(xiàn)緩存資源的最大生命周期,單位是秒
12.為什么第二次打開(kāi)某個(gè)網(wǎng)頁(yè)會(huì)比首次打開(kāi)速度快很多
如果第二次頁(yè)面打開(kāi)很快,主要原因是第一次加載頁(yè)面過(guò)程中,緩存了一些耗時(shí)的數(shù)據(jù)。
主要是DNS 緩存和頁(yè)面資源緩存這兩塊數(shù)據(jù)被瀏覽器進(jìn)行了緩存。
其中,DNS 緩存比較簡(jiǎn)單,它主要就是在瀏覽器本地把對(duì)應(yīng)的 IP 和域名關(guān)聯(lián)起來(lái),這里就不做過(guò)多分析了。我們重點(diǎn)看下瀏覽器資源緩存,下面是緩存處理的過(guò)程:
當(dāng)服務(wù)器返回 HTTP 響應(yīng)頭給瀏覽器時(shí),瀏覽器是通過(guò)響應(yīng)頭中的 Cache-Control 字段來(lái)設(shè)置是否緩存該資源。通常,我們還需要為這個(gè)資源設(shè)置一個(gè)緩存過(guò)期時(shí)長(zhǎng),而這個(gè)時(shí)長(zhǎng)是通過(guò) Cache-Control 中的 Max-age 參數(shù)來(lái)設(shè)置的:
Cache-Control:Max-age=2000
這也就意味著,在該緩存資源還未過(guò)期的情況下, 如果再次請(qǐng)求該資源,會(huì)直接返回緩存中的資源給瀏覽器。
但如果緩存過(guò)期了,瀏覽器則會(huì)繼續(xù)發(fā)起網(wǎng)絡(luò)請(qǐng)求,并且在 HTTP 請(qǐng)求頭中帶上:
If-None-Match:"4f80f-13c-3a1xb12a"
服務(wù)器收到請(qǐng)求頭后,會(huì)根據(jù) If-None-Match 的值來(lái)判斷請(qǐng)求的資源是否有更新。
1.如果沒(méi)有更新,就返回 304 狀態(tài)碼,相當(dāng)于服務(wù)器告訴瀏覽器:“這個(gè)緩存可以繼續(xù)使用,這次就不重復(fù)發(fā)送數(shù)據(jù)給你了。
2.如果資源有更新,服務(wù)器就直接返回最新資源給瀏覽器。
簡(jiǎn)要來(lái)說(shuō),很多網(wǎng)站第二次訪問(wèn)能夠秒開(kāi),是因?yàn)檫@些網(wǎng)站把很多資源都緩存在了本地,瀏覽器緩存直接使用本地副本來(lái)回應(yīng)請(qǐng)求,而不會(huì)產(chǎn)生真實(shí)的網(wǎng)絡(luò)請(qǐng)求,從而節(jié)省了時(shí)間。同時(shí),DNS 數(shù)據(jù)也被瀏覽器緩存了,這又省去了 DNS 查詢環(huán)節(jié)。