DNS 查詢 DNS 緩存javascript
創建 TCP 鏈接(三次握手)鏈接複用php
發送 HTTP 請求(請求的四部分)css
後臺處理請求html
發送 HTTP 響應前端
關閉 TCP 鏈接(四次揮手)java
解析 HTMLnode
下載 CSS(緩存webpack
解析 CSSweb
下載 JS(緩存面試
解析 JS
下載圖片
解析圖片
渲染 DOM 樹
渲染樣式樹
執行 JS
DNS解析 DNS解析的過程就是瀏覽器查找域名對應的 IP 地址;
TCP鏈接 瀏覽器根據 IP 地址向服務器發起 TCP 鏈接,與瀏覽器創建 TCP 三次握手: (1)主機向服務器發送一個創建鏈接的請求(您好,我想認識您); (2)服務器接到請求後發送贊成鏈接的信號(好的,很高興認識您); (3)主機接到贊成鏈接的信號後,再次向服務器發送了確認信號(我也很高興認識您),自此,主機與服務器二者創建了鏈接。
發送HTTP請求 瀏覽器根據 URL 內容生成 HTTP 請求報文。HTTP請求報文是由三部分組成: 請求行, 請求報頭和請求正文,其中包含請求文件的位置、請求文件的方式等等。
服務器處理請求並返回HTTP報文
服務器接到請求後,回想客戶端發送HTTP響應報文。HTTP響應報文也是由三部分組成: 狀態碼, 響應報頭和響應報文。服務器會根據 HTTP 請求中的內容來決定如何獲取相應的 HTML 文件,並將獲得的 HTML 文件發送給瀏覽器。
瀏覽器解析渲染頁面 瀏覽器是一個邊解析邊渲染的過程。在瀏覽器尚未徹底接收 HTML 文件時便開始渲染、顯示網頁。在執行 HTML 中代碼時,根據須要,瀏覽器會繼續請求圖片、CSS、JavsScript等文件,過程同請求 HTML 。
關閉TCP鏈接或繼續保持鏈接
(1)主機向服務器發送一個斷開鏈接的請求(不早了,我該走了);
(2)服務器接到請求後發送確認收到請求的信號(知道了);
(3)服務器向主機發送斷開通知(我也該走了);
(4)主機接到斷開通知後斷開鏈接並反饋一個確認信號(嗯,好的),服務器收到確認信號後斷開鏈接;
爲何要三次握手? 三次握手: A:我能連你了嗎? B: 能夠連我,你連吧 A:那我連你了 開始發送數據
緣由:由於要保證A/B 均可以收發信息 ,數據才能在AB之間傳輸
TCP 三次握手: (1)主機向服務器發送一個創建鏈接的請求(您好,我想認識您); (2)服務器接到請求後發送贊成鏈接的信號(好的,很高興認識您); (3)主機接到贊成鏈接的信號後,再次向服務器發送了確認信號(我也很高興認識您),自此,主機與服務器二者創建了鏈接。
什麼是DOM?
什麼是DOM樹?
Javascript操做DOM經常使用API總結http://luopq.com/2015/11/30/javascript-dom/
6Document.querySelectorAll()
一:DOM leave1 好比onclick只是一個屬性,能夠被覆蓋,因此一個元素只能有一個onclick事件 寫在字符串裏至關於運行字符串裏的代碼
二: DOM L2中,事件註冊(事件監聽隊列)
false
或者 不傳 參數 兒子,爸爸,爺爺true
爺爺,爸爸,兒子
event.stopPropagation()
。stopPropagation,中止傳播,不要再告訴父母了,不要再往上執行冒泡事件了aTag.addEventListener("click",function(e){
e.preventDefault();//禁止默認效果
e.stopPropagation();//阻止冒泡
});
複製代碼
事件觸發通常來講會按照上面的順序進行,可是也有特例,若是給一個目標節點同時註冊冒泡和捕獲事件,事件觸發會按照註冊的順序執行。
// 如下會先打印冒泡而後是捕獲
node.addEventListener('click',(event) =>{
console.log('冒泡')
},false);
node.addEventListener('click',(event) =>{
console.log('捕獲 ')
},true)
複製代碼
事件代理 若是一個節點中的子節點是動態生成的,那麼子節點須要註冊事件的話應該註冊在父節點上
<ul id="ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
let ul = document.querySelector('##ul')
ul.addEventListener('click', (event) => {
console.log(event.target);//li
console.log(event.currentTarget)//ul
})
</script>
複製代碼
事件代理的方式相對於直接給目標註冊事件來講,有節省內存的優勢 event.target和event.currentTarget的區別: event.target是點擊到的最底層的那個元素 event.currentTarget是註冊事件註冊在那個元素上,那個元素就是currentTarget,因此通常是父元素
真名的名字應該是:動態標籤跨域請求!即利用動態標籤script進行跨域請求的技術。 面試官:說說jsonp: 爲何要用jsonp? jsonp要解決的是瀏覽器的跨域數據訪問的問題。(兩個不一樣域名的網站)。 因爲同源策略,不一樣域名不能發請求。可是HTML的<script>
元素是一個例外,script標籤的請求是不受域名限制的,而Ajax是受域名限制的。 如何使用jsonp?
請求方:mataotao.com的前端(瀏覽器),一個網站的前端 響應方:jack.com的後端(服務器),另外一個網站的後端 過程:
<script>
標籤。src
指向響應方,同時傳一個查詢參數?callback=xxxfn
<script>
獲得響應後會當即執行響應過來的內容。因此響應方根據查詢參數構造形如xxxfn("後臺傳過來的數據")
這樣的響應。把要傳的數據寫在callback函數的參數裏。xxxfn('後臺傳過來的數據')
來獲得後臺傳過來的數據,並處理。這就是jsonp
jsonp爲何不能用post請求 jsonp是經過動態建立script實現的,而script標籤發送的是get請求。(缺點,get不安全) 優缺點: JSONP 使用簡單且兼容性不錯,可是隻限於 get 請求
返回的狀態碼: 2開頭:成功 3開頭:重定向 4開頭:客戶端錯誤 5開頭:服務器錯誤
用 form 能夠發get或post或其餘請求,可是會刷新頁面或新開頁面 用 a 能夠發 get 請求,可是也會刷新頁面或新開頁面 用 img 能夠發 get 請求,可是隻能以圖片的形式展現 用 link 能夠發 get 請求,可是隻能以 CSS、favicon 的形式展現 用 script 能夠發 get 請求,可是隻能以腳本的形式運行。 上面幾個均可以發請求,可是各有缺點。
說說Ajax: Ajax 是JS 能夠用直接發起 任意HTTP 請求的技術。
具體來講,AJAX 包括如下幾個步驟。
面試問題:請使用原生JS發送Ajax請求 通常面試大機率會問這個問題,寫不對必定過不了面試
下面四句代碼必定要記住:
myButton.addEventListener("click",(e)=>{
//這四句必定要記住
let request = new XMLHttpRequest();
request.onreadystatechange = ()=>{
request.onreadystatechange = ()=>{
if(request.readyState ===4){//Ajax狀態碼爲4
console.log("請求和響應都完畢了");
if ( request.status>=200&&request.status<300){//響應成功(http狀態碼)
console.log(request.responseText);//打印響應的第四部分,字符串
}else if(request.status>=400){
console.log("響應失敗");
}
}
}
}
request.open('GET','/xxx')//配置request.參數分別爲方法和路徑
request.setRequestHeader('content-type','x-www-form-urlencoded')//設置響應頭必定要寫在
request.send("a=1&b=2");//發送請求
//這四句必定要記住
})
複製代碼
XMLHttpRequest.readyState返回一個整數,表示實例對象的當前狀態。該屬性只讀。它可能返回如下值。
0,表示 XMLHttpRequest 實例已經生成,可是實例的open()方法尚未被調用。 1,表示open()方法已經調用,可是實例的send()方法尚未調用,仍然可使用實例的setRequestHeader()方法,設定 HTTP 請求的頭信息。 2,表示實例的send()方法已經調用,而且服務器返回的頭信息和狀態碼已經收到。 3,表示正在接收服務器傳來的數據體(body 部分)。 4,表示服務器返回的數據已經徹底接收,或者本次接收已經失敗。
協議+域名+端口徹底相同才叫同源 如下三種行爲受到限制: (1) 沒法讀取非同源網頁的 Cookie、LocalStorage 和 IndexedDB。
(2) 沒法接觸非同源網頁的 DOM。
(3) 沒法向非同源地址發送 AJAX 請求(能夠發送,但瀏覽器會拒絕接受響應)。
解決: cookie 瀏覽器經過document.domain屬性來檢查是否同源。 A 網頁的網址是http://w1.example.com/a.html,B 網頁的網址是http://w2.example.com/b.html(一級域名同樣,二級不同)
// 兩個網頁都須要設置
document.domain = 'example.com';
複製代碼
這時候a設置一個cookie,b就能夠讀到這個cookie
AJAX: jsonp CORS(「跨域資源共享」):Access-Control-Allow-Origin
Content-Type: text/html; charset=utf-8
什麼是同源策略? 用 form
、a
、img
、link
、script
、均可以跨域發送請求。 可是隻有 協議+域名+端口 如出一轍才容許發 AJAX 請求。 爲何要有同源策略? 簡單地說就是例如使用form發送請求後,就會刷新頁面,因此原頁面沒有了,就認爲是安全的.可是Ajax能夠吧響應內容讀取了.而且顯示在本頁面上.因此出現安全性問題。
Ajax沒法跨域報的錯誤:
CORS的英文Cross-Origin Resource Sharing,即跨域(源,站)資源共享(跨域) 那麼如何使用CORS突破同源策略解決Ajax的沒法跨域發送請求的問題?
只要服務器端設置響應頭就能夠實現跨域:
response.setHeader('Access-Control-Allow-Origin','http://mataotao.com:8001')
複製代碼
這句話是CORS跨域(突破同源策略)的核心,即容許別的網站(例如http://mataotao.com:8001)跨域向我發Ajax請求,而且容許響應。
爲何不使用jsonp,而是用CORS來跨域? CORS相對於JSONP,CORS能夠發任意請求,而JSONP只能發送get請求
要實現從對象轉換爲 JSON 字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結果是 '{"a": "Hello", "b": "World"}'
複製代碼
要實現從 JSON 轉換爲對象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結果是 {a: 'Hello', b: 'World'}
複製代碼
Cookie 是服務器保存在瀏覽器的一小段文本信息。瀏覽器每次向服務器發出請求,就會自動附上這段信息。 Cookie的做用過程:
COokie的做用:
HTTP 迴應:Cookie 的生成(服務器端生成cookies)
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
複製代碼
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
複製代碼
HTTP 請求:Cookie 的發送(瀏覽器發送Cookie)
瀏覽器向服務器發送 HTTP 請求時,每一個請求都會帶上相應的 Cookie。也就是說,把服務器早前保存在瀏覽器的這段信息,再發回服務器。這時要使用 HTTP 頭信息的Cookie字段。
Cookie: foo=bar
複製代碼
上面代碼會向服務器發送名爲foo的 Cookie,值爲bar。
Cookie字段能夠包含多個 Cookie,使用分號(;)分隔。
Cookie: name=value; name2=value2; name3=value3
複製代碼
下面是一個Http請求的例子。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
複製代碼
讀、寫、刪除、Cookie
讀document.cookie
,前提是該 Cookie 不能有HTTPOnly
屬性。
document.cookie
寫入 Cookie 的例子以下。
document.cookie = 'fontSize=14; '
+ 'expires=' + someDate.toGMTString() + '; '
+ 'path=/subdirectory; '
+ 'domain=*.example.com';
複製代碼
expires
屬性爲一個過去的日期。什麼是session?
window.sessionStorage
和window.localStorage
接口用於腳本在瀏覽器保存數據。
window.sessionStorage.setItem('key', 'value');
window.localStorage.setItem('key', 'value');
複製代碼
window.sessionStorage.getItem('key')
window.localStorage.getItem('key')
複製代碼
localStorage.removeItem('key');
window.localStorage.clear()
複製代碼
注意只能存字符串類型的。
區別:SessionStorage 在用戶關閉頁面(會話結束)後就失效。其他的和localstorage同樣
HTTP緩存有利於web性能優化。HTTP緩存能夠重複利用以前獲取的資源而不用反覆請求,以達到性能優化的目的。 方法
在響應裏設置響應頭 Cache-Control: max-age=30
意思就是30秒以內,瀏覽器再訪問相同的URL的時候,就不發請求,直接從內存裏拿到已經緩存的main.js。 問題:那麼js和css更新了怎麼辦? 瀏覽器請求時發現是相同的URL才使用緩存,那麼能夠設置查詢參數,例如第二個版本的js能夠寫<script src="./main.js?v=2"></script>
,來保證URL的不一樣,從新獲取新的js文件。這樣便可以緩存好久,又能夠隨時更新.(總結:設置查詢參數,保證URL的不一樣)
Expires 是之前用來控制緩存的http頭,Cache-Control是新版的API。
如今首選 Cache-Control。
若是在Cache-Control響應頭設置了 "max-age" 或者 "s-max-age" 指令,那麼 Expires 頭會被忽略。
響應頭設置方式: Expires: Wed, 21 Oct 2015 07:28:00 GMT
Expires 響應頭包含日期/時間, 即在此時候以後,響應過時。 注意: 由於過時標準的時間用的是本地時間,因此不靠譜,因此要遊俠使用Cache-Control代替Expires
答面試官: 與Cache-Control的區別就是:
MD5是消息摘要算法。用於確保信息傳輸完整一致。能夠判斷兩次信息傳輸是否完整一致。
例如
304 Not Modified: HTTP 304 未改變說明無需再次傳輸請求的內容,也就是說能夠使用緩存的內容。
HTTP 304 :沒有響應體
ETag與 Cache-Control的區別
MVC是一種代碼組織形式,只是組織代碼的思想.給面試官將MVC
MVC就是把代碼分爲三塊
M,V,C在代碼中能夠用對象或者類來表示
曾使用 webpack3 用 babel-loader 把 ES6 轉譯爲 ES5 用 sass-loader 把 SCSS 轉譯爲 CSS 做用:
XSS(Cross-site scripting)即跨站點script 舉例
<script>console.log(document.cookie)</script>
,這段代碼被上傳到服務器。產生緣由: 前端的代碼在顯示留言的時候,操做DOM的時候innerHTML方法,或者用了jQuery中的$p.html(content)方法。
解決辦法:
innerText
(jQuery就是用text()
方法,不要本身)< >'' '
這些可疑的符號轉義,如<
變成 <
(HTML實體)(CSRF的全名爲Cross-site request forgery) 僞造跨站請求 過程:
對於get請求能夠很輕鬆的攻擊,對於post,攻擊者可誘導用戶進入帶 Form 表單可用POST方式提交參數的頁面。
解決方法:
解決方法: 一Token字符串驗證。 總結:
二讓用戶本身填寫驗證碼
<head></head>
,script標籤寫在body閉合標籤前面,先加載內容與樣式。