第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
2.2 HTTP 請(qǐng)求方法

面試官提問(wèn): HTTP 協(xié)議的請(qǐng)求方法有哪些,有啥區(qū)別?題目解析:序號(hào)方法說(shuō)明 1GET 請(qǐng)求服務(wù)器上的資源,請(qǐng)求體不會(huì)包含請(qǐng)求數(shù)據(jù),參數(shù)可以通過(guò) URL 傳輸。2POST 用戶(hù)傳輸信息到服務(wù)器,請(qǐng)求方式類(lèi)似 GET 請(qǐng)求,比如提交表單。3PUT 用戶(hù)傳輸信息到服務(wù)器,請(qǐng)求方式類(lèi)似 POST 請(qǐng)求,比如提交文件。4DELETE 請(qǐng)求服務(wù)器刪除某個(gè)資源,和 POST 請(qǐng)求作用相反。5OPTIONS 查詢(xún) URL 支持的 HTTP 方法。6HEAD 請(qǐng)求方式類(lèi)似 GET 請(qǐng)求,但是服務(wù)器不會(huì)返回消息體,一般用于檢查網(wǎng)頁(yè)是否被修改、檢查 URL 是否有效。除此之外,HTTP 協(xié)議還有 TRACE、CONNECT 等方法,但是在日常開(kāi)發(fā)中基本不會(huì)用到,所以不用關(guān)注。面試官常常會(huì)將 POST 和 GET 方法進(jìn)行對(duì)比,我們需要注意以下幾個(gè)不同:(1)GET 請(qǐng)求主要是為了從服務(wù)器獲取資源,POST 請(qǐng)求主要是為了向服務(wù)器發(fā)送資源。(2)GET 請(qǐng)求是通過(guò) URL 傳參,形式是 field = value,多個(gè)參數(shù)使用 & 進(jìn)行分割,例如 http://127.0.0.1/login?username=xiaoming&password=123456。POST 請(qǐng)求是通過(guò)請(qǐng)求體傳參,即信息存放到 Request Body 中。(3)GET 請(qǐng)求傳輸?shù)男畔⒘可?,POST 請(qǐng)求能夠傳輸?shù)男畔⒘慷唷#?)GET 請(qǐng)求參數(shù)在 URL 明文,容易被爬蟲(chóng)直接獲取,POST 請(qǐng)求參數(shù)不直接可見(jiàn),安全性更高,例如在表單提交密碼時(shí),必須使用 POST 請(qǐng)求。

1. HTTP 的歷史背景

一個(gè)東西的產(chǎn)生可能有偶然因素,但是事物的興盛就必然有他客觀(guān)價(jià)值的存在。HTTP(hypertext transport protocol)超文本傳輸協(xié)議也是如此,下面我們來(lái)介紹它誕生的背景。

2.1 第一步:在 Node 環(huán)境中安裝 Http 服務(wù)器

在 Node 環(huán)境中,提供了很多 http 服務(wù)器的支持,例如:Express 、 http server 等。針對(duì) Swagger Editor 的特點(diǎn)和后臺(tái)服務(wù)器的適用條件,這里我們采用 http server 來(lái)當(dāng)做 Swagger Editor 的服務(wù)器支持。至于為什么選擇 http server 來(lái)做后臺(tái)服務(wù)器,這是不屬于本節(jié)所介紹的內(nèi)容,希望同學(xué)們可以在課下了解原因。我們使用一下命令來(lái)在 Node 環(huán)境中安裝 Http Server 服務(wù)器: npm install ‐g http‐server-g 表示全局安裝 http-server 服務(wù)器,這樣我們就可以不用專(zhuān)門(mén)去 http-server 服務(wù)器目錄下啟動(dòng)該服務(wù)了。我們看到如下提示信息就表明安裝 http-server 服務(wù)器成功:

2.1 HTTP 服務(wù)器

Nginx 作為 Web 服務(wù)器能獨(dú)立提供 Http 服務(wù)。另外,我們常常通過(guò) Nginx 作為靜態(tài)資源服務(wù)器來(lái)訪(fǎng)問(wèn)服務(wù)器上的靜態(tài)資源,比如對(duì)于最新熱門(mén)的前后端分離架構(gòu),前端打好包后直接放到某個(gè)地址,在 Nginx 配置后可以通過(guò) Nginx 來(lái)訪(fǎng)問(wèn)主機(jī)上的前端頁(yè)面。

HTTP 協(xié)議和 HTTPS 協(xié)議的對(duì)比

在前面的章節(jié)中我們對(duì) Http 已經(jīng)有了一個(gè)很全面的了解,Http 在滿(mǎn)足通信的基本功能外,也提供了很多豐富的交互功能,但是在安全性方面,Http 還有很多不足的地方,Https 就是為了解決這個(gè)問(wèn)題而誕生。目前 google / 蘋(píng)果 / 騰訊的小程序接口都強(qiáng)制要求使用 Https 安全協(xié)議。以后的網(wǎng)站全面采用 Https 協(xié)議已經(jīng)是一個(gè)可以遇見(jiàn)的趨勢(shì)了。

俯視 HTTP 協(xié)議

生活中的各類(lèi)電商系統(tǒng),學(xué)校的教務(wù)系統(tǒng),工作中的各種辦公軟件基本上都是 Web 網(wǎng)站。少部分的是桌面應(yīng)用,而這一部分的桌面軟件也都紛紛在往 Web 應(yīng)用上面遷移。因?yàn)樽烂孳浖€需要下載 APP 安裝到本地電腦,而 Web 網(wǎng)站你只要打開(kāi)瀏覽器就可以直接訪(fǎng)問(wèn),在便利性方面 Web 網(wǎng)站是有巨大的優(yōu)勢(shì)。作為互聯(lián)網(wǎng)的從業(yè)者,我們需要了解這個(gè)表現(xiàn)背后的原理,那就是 Http 協(xié)議,它幫助我們將遠(yuǎn)端服務(wù)器的數(shù)據(jù)信息傳輸?shù)轿覀優(yōu)g覽器的客戶(hù)端。本小節(jié),將會(huì)從歷史背景,實(shí)現(xiàn)原理,協(xié)議是什么,幾個(gè)方面讓你對(duì) Http 有一個(gè)比較深刻的了解。

2.5 返回 HTTP 響應(yīng)

服務(wù)器端處理業(yè)務(wù)結(jié)果之后,也要返回 HTTP 響應(yīng),HTTP 響應(yīng)由狀態(tài)行(Status Line)、響應(yīng)頭部(Response Headers)、空行(Blank Line)以及響應(yīng)體(Response Body)構(gòu)成,關(guān)于每個(gè)部分的細(xì)節(jié)也不再贅述。需要特別注意的是,響應(yīng)體中的各種錯(cuò)誤碼定義:狀態(tài)類(lèi)型代表狀態(tài)碼和含義說(shuō)明1xx100 Continue服務(wù)器收到了客戶(hù)端的請(qǐng)求行和頭部信息,告訴客戶(hù)端繼續(xù)發(fā)送數(shù)據(jù)部分。2xx200 OK請(qǐng)求成功3xx301 Moved Permanently資源被轉(zhuǎn)移了,請(qǐng)求將被重定向4xx404 Not Found資源沒(méi)找到5xx500 Internal Server Error服務(wù)器內(nèi)部錯(cuò)誤

2. HTTP 狀態(tài)碼

HTTP 狀態(tài)碼是用以表示網(wǎng)頁(yè)服務(wù)器超文本傳輸協(xié)議響應(yīng)狀態(tài)的 3 位數(shù)字代碼,下面列舉出幾種常見(jiàn)的 HTTP 狀態(tài)碼及含義:響應(yīng)碼含義描述100 Continue客戶(hù)端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求,如果請(qǐng)求已經(jīng)完成,忽略這個(gè)響應(yīng)。服務(wù)器必須在請(qǐng)求完成后向客戶(hù)端發(fā)送一個(gè)最終響應(yīng)。200 OK請(qǐng)求已成功,請(qǐng)求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回,出現(xiàn)此狀態(tài)碼是表示正常狀態(tài)。201 Created請(qǐng)求已經(jīng)被實(shí)現(xiàn),而且有一個(gè)新的資源已經(jīng)依據(jù)請(qǐng)求的需要而建立。301 Moved Permanently被請(qǐng)求的資源已永久移動(dòng)到新位置。404 Not Found請(qǐng)求失敗,請(qǐng)求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。500 Internal Server Error服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,服務(wù)器端的源代碼出現(xiàn)錯(cuò)誤時(shí)出現(xiàn)。502 Bad Gateway作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無(wú)效的響應(yīng)。

3.2 運(yùn)行程序 <a href="http://basis.py">basis.py</a>

1. 啟動(dòng)程序$ python basis.py2. 在瀏覽器中首次訪(fǎng)問(wèn) http://localhost:50003. 觀(guān)察控制臺(tái)的輸出before_first_requestbefore_requestexecute requestafter_request應(yīng)用程序在第一個(gè)請(qǐng)求之前要運(yùn)行一次 before_first_request,只會(huì)運(yùn)行一次。4. 在瀏覽器中再次訪(fǎng)問(wèn) http://localhost:50005. 觀(guān)察控制臺(tái)的輸出before_requestexecute requestafter_request在程序整個(gè)生命周期內(nèi),before_first_request,只會(huì)運(yùn)行一次,因此再次訪(fǎng)問(wèn)網(wǎng)站時(shí),不會(huì)再執(zhí)行 before_first_request。

1. HTTP 的基本概念

Http(超文本傳輸協(xié)議) 是一種客戶(hù)端-服務(wù)端模型,使用超媒體文檔進(jìn)行傳輸?shù)?,?jiǎn)單的,無(wú)狀態(tài)的,無(wú)連接的,可擴(kuò)展的應(yīng)用層協(xié)議。下面,我們一一來(lái)分析上述定義的幾個(gè)概念。

Nginx 的 Http 模塊介紹(下)

本小節(jié),我們將主要介紹 Nginx 中 Http 請(qǐng)求 11 個(gè)階段中的最后幾個(gè)重要的階段以及相關(guān)的模塊,并演示其用法。

2. Http報(bào)文格式

Http 協(xié)議請(qǐng)求報(bào)文的本質(zhì)就是一堆字符串,只是這堆字符是有格式的,發(fā)送方跟接收方都需要按照這個(gè)格式來(lái)拼接和拆解內(nèi)容。我們要實(shí)現(xiàn)一個(gè) Web 服務(wù),了解這個(gè)是最基本的要素。以下截圖的報(bào)文是通過(guò) tcpflow(一款功能強(qiáng)大的、基于命令行的免費(fèi)開(kāi)源工具)在 Linux 系統(tǒng)抓包獲取的。sudo tcpflow -c port 8080

1. http 請(qǐng)求 11 個(gè)處理階段介紹

Nginx 將一個(gè) Http 請(qǐng)求分成多個(gè)階段,以模塊為單位進(jìn)行處理。其將 Http請(qǐng)求的處理過(guò)程分成了 11 個(gè)階段,各個(gè)階段可以包含任意多個(gè) Http 的模塊并以流水線(xiàn)的方式處理請(qǐng)求。這 11 個(gè) Http 階段如下所示:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, NGX_HTTP_SERVER_REWRITE_PHASE, NGX_HTTP_FIND_CONFIG_PHASE, NGX_HTTP_REWRITE_PHASE, NGX_HTTP_POST_REWRITE_PHASE, NGX_HTTP_PREACCESS_PHASE, NGX_HTTP_ACCESS_PHASE, NGX_HTTP_POST_ACCESS_PHASE, NGX_HTTP_TRY_FILES_PHASE, NGX_HTTP_CONTENT_PHASE, NGX_HTTP_LOG_PHASE } ngx_http_phases;網(wǎng)上有人做了一個(gè)非常形象的圖片,如下圖所示。我們可以看到 11 個(gè)階段的處理順序,以及每個(gè)階段中涉及到的相關(guān)模塊以及模塊之間的順序。

5.2 運(yùn)行程序 <a href="http://error.py">error.py</a>

1. 啟動(dòng)程序 error.py$ python error.py2. 在瀏覽器中訪(fǎng)問(wèn) http://localhost:5000/non-exist-page3. 觀(guān)察瀏覽器的顯示404 Error訪(fǎng)問(wèn)一個(gè)不存在的頁(yè)面 /non-exist-page,產(chǎn)生 HTTP 404 錯(cuò)誤,F(xiàn)lask 框架執(zhí)行使用 @errorhandler(404) 注冊(cè)的函數(shù) errorhandler,該函數(shù)返回字符串 ‘404 Error’ 給瀏覽器作為響應(yīng)。5. 觀(guān)察控制臺(tái)的輸出error_handler(404)404 Not Found: The requested URL was not found on the server. If URL manually please check your spelling and try again.執(zhí)行 errorhandler 時(shí),首先打印字符串 ‘error_handler(404)’,然后打印 Error 對(duì)象。

5.1 程序代碼 <a href="http://error.py">error.py</a>

通過(guò)一個(gè)具體的例子講解使用 errorhandler 處理 HTTP 錯(cuò)誤,代碼如下:from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def index(): print('execute request') return 'Hello World'@app.errorhandler(404)def errorhandler(e): print('error_handler(404)') print(e) return '404 Error'if __name__ == '__main__': app.run()在第 10 行,使用 @errorhandler(404) 注冊(cè)一個(gè)鉤子函數(shù) errorhandler(e),當(dāng)發(fā)生 HTTP 404 錯(cuò)誤(頁(yè)面不存在)時(shí),調(diào)用鉤子函數(shù),該函數(shù)的第一個(gè)參數(shù)是錯(cuò)誤對(duì)象。

4.2 Android Plugin for Gradle HTTP 代理設(shè)置

若從命令行或在未安裝 Android Studio 的計(jì)算機(jī)上運(yùn)行 Android 插件,則應(yīng)在 Gradle 編譯文件中設(shè)置 Android Plugin for Gradle 代理設(shè)置。對(duì)于特定于應(yīng)用的 HTTP 代理設(shè)置,請(qǐng)根據(jù)各應(yīng)用模塊的要求在 build.gradle 文件中設(shè)置代理設(shè)置。apply plugin: 'com.android.application'android { ... defaultConfig { ... systemProp.http.proxyHost=proxy.company.com systemProp.http.proxyPort=443 systemProp.http.proxyUser=userid systemProp.http.proxyPassword=password systemProp.http.auth.ntlm.domain=domain } ...}對(duì)于整個(gè)項(xiàng)目的 HTTP 代理設(shè)置,請(qǐng)?jiān)?gradle/gradle.properties 文件中設(shè)置代理設(shè)置。Project-wide Gradle settings....systemProp.http.proxyHost=proxy.company.comsystemProp.http.proxyPort=443systemProp.http.proxyUser=usernamesystemProp.http.proxyPassword=passwordsystemProp.http.auth.ntlm.domain=domainsystemProp.https.proxyHost=proxy.company.comsystemProp.https.proxyPort=443systemProp.https.proxyUser=usernamesystemProp.https.proxyPassword=passwordsystemProp.https.auth.ntlm.domain=domain...```

<a href="http://idcbgp.cn/wiki/djangolesson/webbasis2.html">5. HTTP 協(xié)議與網(wǎng)站基本開(kāi)發(fā)流程</a>

這節(jié)課會(huì)介紹一下 Web 開(kāi)發(fā)中常用的一些術(shù)語(yǔ),讓大家對(duì) Web 開(kāi)發(fā)有一個(gè)基本的認(rèn)知,能夠區(qū)分一些比較常見(jiàn)的概念。也會(huì)對(duì) Web 開(kāi)發(fā)必備基礎(chǔ)知識(shí) HTTP 協(xié)議進(jìn)行詳細(xì)講解,如果你想要深入了解 HTTP 協(xié)議的話(huà),可以學(xué)習(xí)這門(mén)《HTTP 教程》。通過(guò)這一小節(jié)的學(xué)習(xí)你會(huì)知道,當(dāng)我們?cè)跒g覽器中輸入 http://idcbgp.cn 這個(gè)地址按下回車(chē)之后到瀏覽器將慕課網(wǎng)的首頁(yè)呈現(xiàn)給我們之間到底發(fā)生了什么?這個(gè)問(wèn)題也是 Web 工程師面試中必問(wèn)的一個(gè)問(wèn)題。除了講解這些概念之外,老師還會(huì)結(jié)合自身的經(jīng)驗(yàn)給大家講解在實(shí)際工作中一個(gè)公司想要開(kāi)發(fā)一個(gè)網(wǎng)站的具體流程是什么,大致劃分為幾個(gè)階段和步驟。好了,本章的介紹到這里就結(jié)束了,下面就開(kāi)始正式的課程學(xué)習(xí)啦~

1.1 Http 請(qǐng)求

請(qǐng)求頭的內(nèi)容有很多,這里給大家做一個(gè)記錄當(dāng)做資料,不需要都記住,在實(shí)際使用中用到可以過(guò)來(lái)查閱即可。Header解釋示例Accept指定客戶(hù)端能夠接收的內(nèi)容類(lèi)型Accept: text/plain, text/htmlAccept-Charset瀏覽器可以接受的字符編碼集。Accept-Charset: iso-8859-5Accept-Encoding指定瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類(lèi)型。Accept-Encoding: compress, gzipAccept-Language瀏覽器可接受的語(yǔ)言Accept-Language: en,zhAccept-Ranges可以請(qǐng)求網(wǎng)頁(yè)實(shí)體的一個(gè)或者多個(gè)子范圍字段Accept-Ranges: bytesAuthorizationHTTP授權(quán)的授權(quán)證書(shū)Authorization: Basic QWxhZIRpbjpvcGAuIHNlc2FtZQ==Cache-Control指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制Cache-Control: no-cacheConnection表示是否需要持久連接。(HTTP 1.1默認(rèn)進(jìn)行持久連接)Connection: closeCookieHTTP請(qǐng)求發(fā)送時(shí),會(huì)把保存在該請(qǐng)求域名下的所有cookie值一起發(fā)送給web服務(wù)器。Cookie: $Version=1; Skin=new;Content-Length請(qǐng)求的內(nèi)容長(zhǎng)度Content-Length: 348Content-Type請(qǐng)求的與實(shí)體對(duì)應(yīng)的MIME信息Content-Type: application/x-www-form-urlencodedDate請(qǐng)求發(fā)送的日期和時(shí)間Date: Tue, 15 Nov 2010 08:12:31 GMTExpect請(qǐng)求的特定的服務(wù)器行為Expect: 100-continueFrom發(fā)出請(qǐng)求的用戶(hù)的EmailFrom: user@email.comHost指定請(qǐng)求的服務(wù)器的域名和端口號(hào)Host: http://idcbgp.cn/wiki/androidlesson/If-Match只有請(qǐng)求內(nèi)容與實(shí)體相匹配才有效If-Match: “737060cd8c284d8af7ad3082f209582d”If-Modified-Since如果請(qǐng)求的部分在指定時(shí)間之后被修改則請(qǐng)求成功,未被修改則返回304代碼If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMTIf-None-Match如果內(nèi)容未改變返回304代碼,參數(shù)為服務(wù)器先前發(fā)送的Etag,與服務(wù)器回應(yīng)的Etag比較判斷是否改變If-None-Match: “737060cd8c284d8af7ad3082f209582d”If-Range如果實(shí)體未改變,服務(wù)器發(fā)送客戶(hù)端丟失的部分,否則發(fā)送整個(gè)實(shí)體。參數(shù)也為EtagIf-Range: “737060cd8c284d8af7ad3082f209582d”If-Unmodified-Since只在實(shí)體在指定時(shí)間之后未被修改才請(qǐng)求成功If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMTMax-Forwards限制信息通過(guò)代理和網(wǎng)關(guān)傳送的時(shí)間Max-Forwards: 10Pragma用來(lái)包含實(shí)現(xiàn)特定的指令Pragma: no-cacheProxy-Authorization連接到代理的授權(quán)證書(shū)Proxy-Authorization: Basic QWxhZGbpbjpAcGVuIHNlc2FtZQ==Range只請(qǐng)求實(shí)體的一部分,指定范圍Range: bytes=500-999Referer先前網(wǎng)頁(yè)的地址,當(dāng)前請(qǐng)求網(wǎng)頁(yè)緊隨其后,即來(lái)路http://idcbgp.cn/wiki/androidlesson/TE客戶(hù)端愿意接受的傳輸編碼,并通知服務(wù)器接受接受尾加頭信息TE: trailers,deflate;q=0.5Upgrade向服務(wù)器指定某種傳輸協(xié)議以便服務(wù)器進(jìn)行轉(zhuǎn)換(如果支持)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11User-AgentUser-Agent的內(nèi)容包含發(fā)出請(qǐng)求的用戶(hù)信息User-Agent: Mozilla/5.0 (Linux; X11)Via通知中間網(wǎng)關(guān)或代理服務(wù)器地址,通信協(xié)議Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)Warning關(guān)于消息實(shí)體的警告信息Warn: 199 Miscellaneous warning

4.2 運(yùn)行程序 <a href="http://diff.py">diff.py</a>

1. 啟動(dòng)程序 diff.py$ python diff.py2. 在瀏覽器中訪(fǎng)問(wèn) http://localhost:50003. 觀(guān)察控制臺(tái)的輸出execute request without errorafter_requestteardown_request: None訪(fǎng)問(wèn)頁(yè)面 / 時(shí),執(zhí)行處理函數(shù) index,執(zhí)行請(qǐng)求結(jié)束后,會(huì)調(diào)用 after_request 和 teardown_request。該函數(shù)執(zhí)行期間沒(méi)有發(fā)生異常,傳遞給 teardown_request 鉤子函數(shù)的 exception 對(duì)象為 None。4. 在瀏覽器中訪(fǎng)問(wèn) http://localhost:5000/error5. 觀(guān)察控制臺(tái)的輸出execute request with errorTraceback (most recent call last): File "diff.py", line 14, in error 1 / 0ZeroDivisionError: division by zeroafter_requestteardown_request: division by zero訪(fǎng)問(wèn)頁(yè)面 /error 時(shí),執(zhí)行處理函數(shù) error,執(zhí)行請(qǐng)求結(jié)束后,會(huì)調(diào)用 after_request 和 teardown_request。該函數(shù)執(zhí)行期間發(fā)生異常,傳遞給 teardown_request 鉤子函數(shù)的 exception 對(duì)象為 ZeroDivisionError。

2.2 第二步:在 http server 服務(wù)器中安裝運(yùn)行 Swagger Editor

要想在 http server 服務(wù)器中安裝 Swagger Editor ,需要我們首先將 Swagger Editor 的壓縮包下載下來(lái),這就相當(dāng)于在安裝 Swagger Codegen 時(shí)的 Jar 包。出于方便考慮,我將 Swagger Editor 的資源壓縮包放到了我的 Git 上面,同學(xué)們可以通過(guò)訪(fǎng)問(wèn)以下鏈接獲?。篽ttps://github.com/SteafanMrZhou/MoocSwaggerWiki在安裝好 http server 服務(wù)器之后,我們將下載好的壓縮包進(jìn)行解壓,在解壓完成后我們輸入以下命令來(lái)啟動(dòng) Swagger Editor 服務(wù): http-server swagger-editor我們看到下圖提示信息則表明 Swagger Editor 服務(wù)已經(jīng)安裝成功并成功運(yùn)行:

HTTP 協(xié)議及其請(qǐng)求過(guò)程

TCP/IP 的網(wǎng)絡(luò)模型有 7 層,Http 協(xié)議是位于最上層的應(yīng)用層。應(yīng)用層協(xié)議的意思是它是服務(wù)于我們能體驗(yàn)到的一些電腦軟件,QQ/郵箱/瀏覽器這些。應(yīng)用層下面還有好幾層,他們主要保障的是網(wǎng)絡(luò)傳輸中的一些安全性(會(huì)話(huà)加密),可靠性(字節(jié)冗余校驗(yàn)),字符轉(zhuǎn)字節(jié),字節(jié)轉(zhuǎn)高低電平實(shí)現(xiàn)信號(hào)的傳輸?shù)取?/p>

3.1.2 驗(yàn)證 HTTP Referer 字段

正常情況下,Referer 字段和請(qǐng)求的地址是位于同一域名下的。如果是 CSRF 攻擊發(fā)起的請(qǐng)求,那么 Referer 字段和請(qǐng)求的地址就不是同一域名了,因此,服務(wù)器通過(guò)驗(yàn)證 HTTP Referer 字段就能識(shí)別出 CSRF 攻擊。該方法的優(yōu)點(diǎn)在于:只需要給所有安全敏感的請(qǐng)求統(tǒng)一增加一個(gè)攔截器來(lái)檢查 Referer 的值就可以防御所有的 CSRF 攻擊;特別是對(duì)于當(dāng)前現(xiàn)有的系統(tǒng),不需要改變當(dāng)前系統(tǒng)的任何已有代碼和邏輯,沒(méi)有風(fēng)險(xiǎn),非常便捷。該方法的缺點(diǎn)在于:攻擊者能夠篡改請(qǐng)求頭的 Referer 字段內(nèi)容,從而欺騙服務(wù)器;有可能無(wú)法獲取 Referer 的值,因?yàn)?Referer 值會(huì)記錄下用戶(hù)的訪(fǎng)問(wèn)來(lái)源,有些用戶(hù)認(rèn)為這樣會(huì)侵犯到他們自己的隱私權(quán),因此,用戶(hù)自己可以設(shè)置瀏覽器使其在發(fā)送請(qǐng)求時(shí)不再提供 Referer。

HTTP 協(xié)議與網(wǎng)站基本開(kāi)發(fā)流程

上節(jié)課我們學(xué)習(xí)了 Web 開(kāi)發(fā)中必備的一些 HTML/CSS/JS 這一節(jié)中我們會(huì)繼續(xù)介紹下 Web 開(kāi)發(fā)中的一些基礎(chǔ)知識(shí),包括常用術(shù)語(yǔ)、HTTP 協(xié)議、 URL 的組成部分,以及網(wǎng)站運(yùn)行原理和開(kāi)發(fā)的流程。只有理解了這些基礎(chǔ)知識(shí),才能繼續(xù)后續(xù)的 Django 學(xué)習(xí)。

1.2 Http 響應(yīng)

響應(yīng)就是服務(wù)器收到我們的 request 之后給我們返回的數(shù)據(jù),同樣記錄一下響應(yīng)頭:Header解釋示例Accept-Ranges表明服務(wù)器是否支持指定范圍請(qǐng)求及哪種類(lèi)型的分段請(qǐng)求Accept-Ranges: bytesAge從原始服務(wù)器到代理緩存形成的估算時(shí)間(以秒計(jì),非負(fù))Age: 12Allow對(duì)某網(wǎng)絡(luò)資源的有效的請(qǐng)求行為,不允許則返回405Allow: GET, HEADCache-Control告訴所有的緩存機(jī)制是否可以緩存及哪種類(lèi)型Cache-Control: no-cacheContent-Encodingweb服務(wù)器支持的返回內(nèi)容壓縮編碼類(lèi)型Content-Encoding: gzipContent-Language響應(yīng)體的語(yǔ)言Content-Language: en,zhContent-Length響應(yīng)體的長(zhǎng)度Content-Length: 348Content-Location請(qǐng)求資源可替代的備用的另一地址Content-Location: /index.htmContent-MD5返回資源的MD5校驗(yàn)值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==Content-Range在整個(gè)返回體中本部分的字節(jié)位置Content-Range: bytes 21010-47021/47022Content-Type返回內(nèi)容的MIME類(lèi)型Content-Type: text/html; charset=utf-8Date原始服務(wù)器消息發(fā)出的時(shí)間Date: Tue, 15 Nov 2010 08:12:31 GMTETag請(qǐng)求變量的實(shí)體標(biāo)簽的當(dāng)前值ETag: “737060cd8c284d8af7ad3082f209582d”Expires響應(yīng)過(guò)期的日期和時(shí)間Expires: Thu, 01 Dec 2010 16:00:00 GMTLast-Modified請(qǐng)求資源的最后修改時(shí)間Last-Modified: Tue, 15 Nov 2010 12:45:26 GMTLocation用來(lái)重定向接收方到非請(qǐng)求URL的位置來(lái)完成請(qǐng)求或標(biāo)識(shí)新的資源Location: http://idcbgp.cn/wiki/androidlesson/Pragma包括實(shí)現(xiàn)特定的指令,它可應(yīng)用到響應(yīng)鏈上的任何接收方Pragma: no-cacheProxy-Authenticate它指出認(rèn)證方案和可應(yīng)用到代理的該URL上的參數(shù)Proxy-Authenticate: Basic

3.2 訪(fǎng)問(wèn)資源的 API

客戶(hù)端可以查看、新增、修改、刪除主題,相應(yīng)的 URI 如下:HTTP 方法行為URIGET獲取所有的主題http://www.bbs.com/topicsGET獲取特定的主題http://www.bbs.com/topics/123POST新建主題http://www.bbs.com/topicsPUT修改主題http://www.bbs.com/topics/123DELETE刪除主題http://www.bbs.com/topics/123客戶(hù)端可以查看、新增、修改、刪除回復(fù),相應(yīng)的 URI 如下:HTTP 方法行為URIGET獲取所有的回復(fù)http://www.bbs.com/answersGET獲取特定的回復(fù)http://www.bbs.com/answers/456POST新建回復(fù)http://www.bbs.com/answersPUT修改回復(fù)http://www.bbs.com/answers/456DELETE刪除回復(fù)http://www.bbs.com/answers/456

5.1. Netty 主啟動(dòng)類(lèi)

public class MyWebSocketServer { public static void main(String[] args) throws Exception{ EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup); serverBootstrap.channel(NioServerSocketChannel.class); serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //因?yàn)榛趆ttp協(xié)議,使用http的編碼和解碼器 pipeline.addLast(new HttpServerCodec()); //是以塊方式寫(xiě),添加ChunkedWriteHandler處理器 pipeline.addLast(new ChunkedWriteHandler()); //http數(shù)據(jù)在傳輸過(guò)程中是分段, HttpObjectAggregator ,就是可以將多個(gè)段聚合 pipeline.addLast(new HttpObjectAggregator(8192)); //將 http協(xié)議升級(jí)為 ws協(xié)議 , 保持長(zhǎng)連接 pipeline.addLast(new WebSocketServerProtocolHandler("/hello2")); //自定義的handler ,處理業(yè)務(wù)邏輯 pipeline.addLast(new MyWebSocketHandler()); } }); //啟動(dòng)服務(wù)器 ChannelFuture channelFuture = serverBootstrap.bind(7000).sync(); channelFuture.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }}代碼說(shuō)明:WebSocket 比 TCP 和 Http 協(xié)議都稍微復(fù)雜有點(diǎn),它其實(shí)是 TCP 和 Http 協(xié)議的結(jié)合,首先是連接之前發(fā)送的是 Http 協(xié)議請(qǐng)求,但是新增 Http 所沒(méi)有的附加頭信息 Upgrade: WebSocket 表明是一個(gè)申請(qǐng)協(xié)議升級(jí)的 Http 請(qǐng)求。其次,真正建立連接之后,其實(shí)底層是 TCP 協(xié)議長(zhǎng)連接;HttpServerCodec 將請(qǐng)求和應(yīng)答消息解碼為 HTTP 消息;ChunkedWriteHandler 向客戶(hù)端發(fā)送 HTML5 文件;http 數(shù)據(jù)在傳輸過(guò)程中是分段,當(dāng)瀏覽器發(fā)送大量數(shù)據(jù)時(shí),就會(huì)發(fā)出多次 http 請(qǐng)求, HttpObjectAggregator 可以將 HTTP 消息的多個(gè)部分合成一條完整的 HTTP 消息;WebSocketServerProtocolHandler 定義了 WebSocket 的對(duì)外暴露地址。

3. 小結(jié)

這一小節(jié),我們講解了 HTTP 的基本概念,熟悉了 HTTP 簡(jiǎn)單的工作流程。其實(shí) HTTP 協(xié)議比較復(fù)雜,感興趣的讀者可以更加深入的去學(xué)習(xí) HTTP 底層的原理,對(duì)以后開(kāi)發(fā)爬蟲(chóng)以及 WEB 應(yīng)用都有很大的幫助。

4.2 proxy_cache 緩存實(shí)驗(yàn)

準(zhǔn)備好 proxy_cache 緩存相關(guān)的配置,如下:...http { server { listen 8000; location / { default_type text/plain; return 200 '8000, server\n'; } } server { listen 8001; location / { default_type text/plain; return 200 '8001, server\n'; } } server { listen 8002; location / { default_type text/plain; return 200 '8002, server\n'; } } # 定義上游服務(wù)器 upstream backends { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; } # proxy_cache_path 指令 proxy_cache_path /root/test/cache levels=1:2 keys_zone=nginx_cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; location / { proxy_pass http://backends; proxy_cache nginx_cache; # 狀態(tài)碼為200和301的緩存1分鐘 proxy_cache_valid 200 301 1m; # 其余的緩存10分鐘 proxy_cache_valid any 10m; # response響應(yīng)的頭信息中定義緩存的狀態(tài)(有沒(méi)有命中) proxy_cache_key "$host$uri$is_args$args"; expires 1d; proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; proxy_no_cache $http_pragma $http_authorization; # add_header 響應(yīng)添加緩沖命中結(jié)果 add_header Nginx-Cache "$upstream_cache_status"; } }...我們通過(guò) curl 命令向 Nginx 所在主機(jī)的 80端 請(qǐng)求,第一次請(qǐng)求轉(zhuǎn)發(fā)到8000端口,結(jié)果被緩存; 第2-3次請(qǐng)求時(shí)由緩存返回結(jié)果,所以仍然是8000端口的返回;等待超過(guò)1分鐘后,緩存失效,請(qǐng)求被轉(zhuǎn)發(fā)到8001端口進(jìn)行處理,返回相應(yīng)結(jié)果;最后再次請(qǐng)求80端口,依舊由緩存命中,返回8001端口的響應(yīng)結(jié)果。參看日志記錄的 http 請(qǐng)求。# 第一次請(qǐng)求,轉(zhuǎn)到8000端口響應(yīng),然后緩存[shen@shen ~]$ curl http://180.76.152.1138000, server# 接下來(lái)請(qǐng)求全部由緩存命中[shen@shen ~]$ curl http://180.76.152.1138000, server[shen@shen ~]$ curl http://180.76.152.1138000, server[shen@shen ~]$ curl http://180.76.152.1138000, server# 緩存失效,轉(zhuǎn)發(fā)到8001端口相應(yīng),并緩存結(jié)果[shen@shen ~]$ curl http://180.76.152.1138001, server# 繼續(xù)命中緩存[shen@shen ~]$ curl http://180.76.152.1138001, server查看請(qǐng)求的響應(yīng)結(jié)果:[root@server sbin]# tail -f ../logs/access.log127.0.0.1 - - [06/Feb/2020:20:14:15 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-""-"103.46.244.69 - - [06/Feb/2020:20:14:15 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""MISS"103.46.244.69 - - [06/Feb/2020:20:14:23 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"103.46.244.69 - - [06/Feb/2020:20:14:26 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"127.0.0.1 - - [06/Feb/2020:20:16:10 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-""-"103.46.244.69 - - [06/Feb/2020:20:16:10 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""EXPIRED"103.46.244.69 - - [06/Feb/2020:20:16:22 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"

直播
查看課程詳情
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)