概念及常識
HTTP (Hypertext transfer protocol)
- 超文本傳輸協(xié)議;
- 詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間通信的規(guī)則;
- 瀏覽器變得更加高效,傳輸字節(jié)變少;
- 工作在應(yīng)用層,是無狀態(tài)協(xié)議,由請求和響應(yīng)兩部分組成;
- HTTP默認(rèn)端口是80;
- HTTPS默認(rèn)端口是443;
HTTP協(xié)議通常承載于TCP協(xié)議之上;有時也承載于TLS或SSL協(xié)議層之上,也就是我們常說的HTTPS。

大部分網(wǎng)站采用HTTP協(xié)議進(jìn)行交互,目前仍有大量的客戶端采用HTTP協(xié)議進(jìn)行交互。但是隨著安全等級的提升,這些交互逐漸被HTTPS協(xié)議取代;
請求的流程
一次HTTP操作稱為一個事務(wù),其工作過程可分為五步:
- 1)客戶端與服務(wù)器開始建立連接;
- 2)客戶端發(fā)送一個請求給服務(wù)器,請求的格式為:URL(統(tǒng)一資源標(biāo)識符)、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶端信息及內(nèi)容;
- 3)服務(wù)器接到請求后,給予相應(yīng)的響應(yīng)信息,其格式為一個狀態(tài)行,包括信息的協(xié)議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務(wù)器信息、實(shí)體信息及內(nèi)容;
- 4)客戶端接收服務(wù)器所返回的信息,進(jìn)行對應(yīng)處理;
- 5)客戶端與服務(wù)器斷開連接;

所有流程,均由HTTP請求自動完成。如果在以上過程中的某一步出現(xiàn)錯誤,那么產(chǎn)生錯誤的信息將返回,客戶端做對應(yīng)處理??梢允强蛻舳酥苯优c服務(wù)器進(jìn)行交互,也可能在請求中間增加代理。
HTTP基于傳輸層TCP協(xié)議,而TCP是一個端到端的面向連接的協(xié)議。所謂的端到端可以理解為進(jìn)程到進(jìn)程之間的通信。所以HTTP在開始傳輸之前,首先需要建立TCP連接,而TCP連接的過程需要所謂的“三次握手”。盜用下圖所示TCP連接的三次握手:

在TCP三次握手之后,TCP連接建立,此時HTTP就可以進(jìn)行傳輸了。
在HTTP1.1中傳輸完成之后并不斷開TCP連接,需要通過Connection頭設(shè)置。
具體三次握手和四次揮手,可參考文章:https://www.cnblogs.com/Andya/p/7272462.html,非常詳細(xì)。
HTTP協(xié)議特點(diǎn)
由于服務(wù)器的IP或者域名都是相對固定的,而客戶端可能經(jīng)常發(fā)生變化,因此HTTP協(xié)議似乎永遠(yuǎn)是客戶端(Client)發(fā)起請求,服務(wù)器(Server)返回響應(yīng),Request和Response成對出現(xiàn)。同時,如果客戶端沒有主動請求,很難實(shí)現(xiàn)由服務(wù)端向客戶端推送數(shù)據(jù)。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
1、支持客戶端/服務(wù)器模式,支持基本認(rèn)證和安全認(rèn)證。
2、簡單快速
客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
3、靈活
HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
4、可以持續(xù)連接
HTTP 0.9和1.0使用非持續(xù)連接,限制每次連接只處理一個請求,服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接;HTTP 1.1使用持續(xù)連接,默認(rèn)都開啟了Keep-Alive,不必為每個web對象創(chuàng)建一個新的連接,一個連接可以傳送多個對象,采用這種方式可以節(jié)省傳輸時間。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間。
5、無狀態(tài)
協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。
請求格式及方法
格式
URL(Uniform Resource Locator)格式,http://www.xxxxxx.com/images/icon.png;
地址用于描述一個網(wǎng)絡(luò)上的資源,使用協(xié)議+host+path的方式,基本格式如下:
schema://host[:port#]/path/.../[url-params]?[query-string][#fragment]
- scheme:使用的協(xié)議名稱(如:http, https, ftp);
- host:服務(wù)器的IP地址或者域名;
- port:端口號,HTTP的默認(rèn)端口是80,可以省略。如果使用了別的端口,必須指明,例如 > * http://www.xxxx.com:7000/;
- path:訪問資源的路徑;
- url-params:文件名稱,后邊用問好與參數(shù)分隔;
- query-string:各個參數(shù)的名稱和具體值,用等號連接,多個鍵值對用‘&’進(jìn)行分隔;
- fragment:網(wǎng)頁中可能會分為不同的片段,如果想訪問網(wǎng)頁后直接到達(dá)指定位置,可以在這部分設(shè)置;
請求頭參數(shù)
Accept
客戶端可以接收的MIME類型。例如:Accept: text/html,表示接收服務(wù)器的文本;如果服務(wù)器無法返回text/html類型的數(shù)據(jù),服務(wù)器會返回一個406錯誤(non acceptable)。平時可以使用Accept: / 代表瀏覽器可以處理所有類型。
Accept-Encoding
客戶端聲明可以接收的編碼方式,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate);Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁面,可以節(jié)省5到10倍的下載時間。例如: Accept-Encoding: gzip, deflate。如果請求消息中沒有設(shè)置這個域,服務(wù)器默認(rèn)客戶端可以接收所有編碼。
Accept-Language
聲明自己接收的語言。語言跟字符集的區(qū)別:中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等;例如:Accept-Language:en-us。如果請求消息中沒有設(shè)置這個報頭域,服務(wù)器假定客戶端可以接收所有語言。
Accept-Charset
瀏覽器可接受的字符集。如果在請求消息中沒有設(shè)置這個域,默認(rèn)表示任何字符集都可以接受。
User-Agent
告訴服務(wù)器,客戶端使用的操作系統(tǒng)和瀏覽器的名稱和版本。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)。
Content-Type
例如:Content-Type: application/x-www-form-urlencoded。
Referer
包含一個URL,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請求的頁面。提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個鏈接過來的,主要用來統(tǒng)計訪問來源。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Connection:
例如:Connection: keep-alive,當(dāng)一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接。HTTP 1.1默認(rèn)進(jìn)行持久連接。利用持久連接的優(yōu)點(diǎn),當(dāng)頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實(shí)現(xiàn)這一點(diǎn),Servlet需要在應(yīng)答中發(fā)送一個Content-Length頭,最簡單的實(shí)現(xiàn)方法是:先把內(nèi)容寫入ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計算它的大小。
再比如:Connection:close 代表一個Request完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關(guān)閉,當(dāng)客戶端再次發(fā)送Request,需要重新建立TCP連接。
Host
主要用于指定被請求資源的Internet主機(jī)和端口號,它通常從HTTP URL中提取出來的。HTTP/1.1請求必須包含主機(jī)頭域,否則系統(tǒng)會以400狀態(tài)碼返回。
Cookie
瀏覽器很常用由于HTTP請求沒有狀態(tài),所以將cookie的值發(fā)送給HTTP服務(wù)器,許多廣告的精準(zhǔn)推薦就是這樣來的。
Content-Length
表示請求消息正文的長度。例如:Content-Length: 13540,可以做消息是否完成的校驗(yàn)。
Authorization
授權(quán)信息,通常出現(xiàn)在對服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。主要用于證明客戶端有權(quán)查看某個資源。當(dāng)瀏覽器訪問一個頁面時,如果收到服務(wù)器的響應(yīng)代碼為401(未授權(quán)),可以發(fā)送一個包含Authorization請求報頭域的請求,要求服務(wù)器對其進(jìn)行驗(yàn)證。
UA-Pixels,UA-Color,UA-OS,UA-CPU
由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請求頭,表示屏幕大小、顏色深度、操作系統(tǒng)和CPU類型。
Range
可以請求實(shí)體的一個或者多個子范圍,下載文件的斷點(diǎn)續(xù)傳就是使用這個字段做的;例如:
表示頭500個字節(jié):bytes=0-499
表示第二個500字節(jié):bytes=500-999
表示最后500個字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個和最后一個字節(jié):bytes=0-0,-1
同時指定幾個范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應(yīng)會以狀態(tài)碼206(PartialContent)返回而不是以200(OK)
請求方式 - Request
HTTP/1.1協(xié)議,共定義了八種方法,用來表明Request-URI指定的資源的不同操作方式:
GET
向特定的資源發(fā)出“獲取”請求。GET方法最好只用于獲取數(shù)據(jù),不修改服務(wù)器的任何信息;GET方法多會將參數(shù)拼接在url的后端,相當(dāng)于明文傳輸,因此不要使用該方法傳遞任何敏感信息;GET最大字節(jié)數(shù)為1024。
POST
向指定資源提交數(shù)據(jù)進(jìn)行處理請求,提交表單或者上傳文件。數(shù)據(jù)被包含在請求體中;POST請求可能會導(dǎo)致新的資源的建立或已有資源的修改。
PUT
向指定資源位置上傳其最新內(nèi)容。
DELETE
請求服務(wù)器刪除Request-URI所標(biāo)識的資源。
OPTIONS
返回服務(wù)器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請求來測試服務(wù)器的功能性。
HEAD
向服務(wù)器索要與GET請求相一致的響應(yīng),只不過響應(yīng)體將不會被返回。這一方法可以在不必傳輸整個響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。該方法常用于測試超鏈接的有效性,是否可以訪問,以及最近是否更新。
TRACE
回顯服務(wù)器收到的請求,主要用于測試或診斷。
CONNECT
HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
PATCH
用來將局部修改應(yīng)用于某一資源,添加于規(guī)范RFC5789。
方法名稱區(qū)分大小寫。當(dāng)某個請求所針對的資源不支持對應(yīng)的請求方法的時候,服務(wù)器返回狀態(tài)碼405(Method Not Allowed);當(dāng)服務(wù)器不認(rèn)識或者不支持對應(yīng)的請求方法的時候,應(yīng)當(dāng)返回狀態(tài)碼501(Not Implemented)。
HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。
響應(yīng)消息 - Response
包含:狀態(tài)行、消息報頭、響應(yīng)正文。
每一次請求,都會產(chǎn)生一個響應(yīng)。一般使用狀態(tài)碼,粗略區(qū)分請求是否成功。如果一切正常,一個標(biāo)準(zhǔn)網(wǎng)頁會收到一條200的狀態(tài)碼;錯誤有對應(yīng)的錯誤碼,常見的有403、404、500等。
下面列出所有錯誤碼:
以1開頭:表示接收到請求并且繼續(xù)處理
- 100 - 客戶必須繼續(xù)發(fā)出請求
- 101 - 客戶要求服務(wù)器根據(jù)請求轉(zhuǎn)換HTTP協(xié)議版本
以2開頭:表示動作被成功接收、理解和接受,一般可理解為響應(yīng)成功
- 200 - 表明該請求被成功地完成,所請求的資源發(fā)送回客戶端
- 201 - 提示知道新文件的URL
- 202 - 接受和處理、但處理未完成
- 203 - 返回信息不確定或不完整
- 204 - 請求收到,但返回信息為空
- 205 - 服務(wù)器完成了請求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件
- 206 - 服務(wù)器已經(jīng)完成了部分用戶的GET請求
以3開頭:為了完成指定的動作,必須接受進(jìn)一步處理,即重定向
- 300 - 請求的資源可在多處得到
- 301 - 本網(wǎng)頁被永久性轉(zhuǎn)移到另一個URL
- 302 - 請求的網(wǎng)頁被轉(zhuǎn)移到一個新的地址,但客戶訪問仍繼續(xù)通過原始URL地址,重定向,新的URL會在response中的Location中返回,瀏覽器將會使用新的URL發(fā)出新的Request。
- 303 - 建議客戶訪問其他URL或訪問方式
- 304 - 自從上次請求后,請求的網(wǎng)頁未修改過,服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容,代表上次的文檔已經(jīng)被緩存了,還可以繼續(xù)使用
- 305 - 請求的資源必須從服務(wù)器指定的地址得到
- 306 - 前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用
- 307 - 申明請求的資源臨時性刪除
以4開頭:請求包含錯誤語法或不能正確執(zhí)行
- 400 - 客戶端請求有語法錯誤,不能被服務(wù)器所理解
- 401 - 請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
- HTTP 401.1 - 未授權(quán):登錄失敗
- HTTP 401.2 - 未授權(quán):服務(wù)器配置問題導(dǎo)致登錄失敗
- HTTP 401.3 - ACL 禁止訪問資源
- HTTP 401.4 - 未授權(quán):授權(quán)被篩選器拒絕
- HTTP 401.5 - 未授權(quán):ISAPI 或 CGI 授權(quán)失敗
- 402 - 保留有效ChargeTo頭響應(yīng)
- 403 - 禁止訪問,服務(wù)器收到請求,但是拒絕提供服務(wù)
- HTTP 403.1 - 禁止訪問:禁止可執(zhí)行訪問
- HTTP 403.2 - 禁止訪問:禁止讀訪問
- HTTP 403.3 - 禁止訪問:禁止寫訪問
- HTTP 403.4 - 禁止訪問:要求 SSL
- HTTP 403.5 - 禁止訪問:要求 SSL 128
- HTTP 403.6 - 禁止訪問:IP 地址被拒絕
- HTTP 403.7 - 禁止訪問:要求客戶證書
- HTTP 403.8 - 禁止訪問:禁止站點(diǎn)訪問
- HTTP 403.9 - 禁止訪問:連接的用戶過多
- HTTP 403.10 - 禁止訪問:配置無效
- HTTP 403.11 - 禁止訪問:密碼更改
- HTTP 403.12 - 禁止訪問:映射器拒絕訪問
- HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
- HTTP 403.15 - 禁止訪問:客戶訪問許可過多
- HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
- HTTP 403.17 - 禁止訪問:客戶證書已經(jīng)到期或者尚未生效
- 404 - 一個404錯誤表明可連接服務(wù)器,但服務(wù)器無法取得所請求的網(wǎng)頁,請求資源不存在。eg:輸入了錯誤的URL
- 405 - 用戶在Request-Line字段定義的方法不允許
- 406 - 根據(jù)用戶發(fā)送的Accept拖,請求資源不可訪問
- 407 - 類似401,用戶必須首先在代理服務(wù)器上得到授權(quán)
- 408 - 客戶端沒有在用戶指定的餓時間內(nèi)完成請求
- 409 - 對當(dāng)前資源狀態(tài),請求不能完成
- 410 - 服務(wù)器上不再有此資源且無進(jìn)一步的參考地址
- 411 - 服務(wù)器拒絕用戶定義的Content-Length屬性請求
- 412 - 一個或多個請求頭字段在當(dāng)前請求中錯誤
- 413 - 請求的資源大于服務(wù)器允許的大小
- 414 - 請求的資源URL長于服務(wù)器允許的長度
- 415 - 請求資源不支持請求項(xiàng)目格式
- 416 - 請求中包含Range請求頭字段,在當(dāng)前請求資源范圍內(nèi)沒有range指示值,請求也不包含If-Range請求頭字段
- 417 - 服務(wù)器不滿足請求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級服務(wù)器不能滿足請求長。
以5開頭:服務(wù)器不能正確執(zhí)行一個正確的請求,一般都為服務(wù)器錯誤
- HTTP 500 - 服務(wù)器遇到錯誤,無法完成請求
- HTTP 500.100 - 內(nèi)部服務(wù)器錯誤 - ASP 錯誤
- HTTP 500-11 服務(wù)器關(guān)閉
- HTTP 500-12 應(yīng)用程序重新啟動
- HTTP 500-13 - 服務(wù)器太忙
- HTTP 500-14 - 應(yīng)用程序無效
- HTTP 500-15 - 不允許請求 global.asa
- Error 501 - 未實(shí)現(xiàn)
- HTTP 502 - 網(wǎng)關(guān)錯誤
- HTTP 503:由于超載或停機(jī)維護(hù),服務(wù)器目前無法使用,一段時間后可能恢復(fù)正常
發(fā)現(xiàn)了一個趣味狀態(tài)碼圖,喜歡可以點(diǎn)擊:https://www.toutiao.com/i6628119994469204484/
響應(yīng)頭參數(shù)
Allow
服務(wù)器支持哪些請求方法(如GET、POST等)。
Date
表示消息發(fā)送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標(biāo)準(zhǔn)時,換算成本地時間,需要知道用戶所在的時區(qū)。你可以用setDateHeader來設(shè)置這個頭以避免轉(zhuǎn)換時間格式的麻煩
Expires
指明應(yīng)該在什么時候認(rèn)為文檔已經(jīng)過期,從而不再緩存它,重新從服務(wù)器獲取,會更新緩存。過期之前使用本地緩存。HTTP1.1的客戶端和緩存會將非法的日期格式(包括0)看作已經(jīng)過期。eg:為了讓瀏覽器不要緩存頁面,我們也可以將Expires實(shí)體報頭域,設(shè)置為0。
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
P3P
用于跨域設(shè)置Cookie, 這樣可以解決iframe跨域訪問cookie的問題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
非常重要的header, 用于把cookie發(fā)送到客戶端瀏覽器,每一個寫入cookie都會生成一個Set-Cookie。
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
ETag
和If-None-Match 配合使用。
Last-Modified
用于指示資源的最后修改日期和時間。Last-Modified也可用setDateHeader方法來設(shè)置。
Content-Type
WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象的類型和字符集。Servlet默認(rèn)為text/plain,但通常需要顯式地指定為text/html。由于經(jīng)常要設(shè)置Content-Type,因此HttpServletResponse提供了一個專用的方法setContentType??稍趙eb.xml文件中配置擴(kuò)展名和MIME類型的對應(yīng)關(guān)系。
例如:Content-Type: text/html;charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
媒體類型的格式為:大類/小類,比如text/html。
IANA(The Internet Assigned Numbers Authority,互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))定義了8個大類的媒體類型,分別是:
- application,比如: application/vnd.ms-excel.
- audio,比如: audio/mpeg.
- image,比如: image/png.
- message,比如,:message/http.
- model,比如:model/vrml.
- multipart,比如:multipart/form-data.
- text,比如:text/html.
- video,比如:video/quicktime.
Content-Range
用于指定整個實(shí)體中的一部分的插入位置,他也指示了整個實(shí)體的長度。在服務(wù)器向客戶返回一個部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個實(shí)體長度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。
例如,傳送頭500個字節(jié)次字段的形式:Content-Range:bytes0-499/1234如果一個http消息包含此節(jié)(例如,對范圍請求的響 應(yīng)或?qū)σ幌盗蟹秶闹丿B請求),Content-Range表示傳送的范圍。
Content-Length
指明實(shí)體正文的長度,以字節(jié)方式存儲的十進(jìn)制數(shù)字來表示。在數(shù)據(jù)下行的過程中,Content-Length的方式要預(yù)先在服務(wù)器中緩存所有數(shù)據(jù),然后所有數(shù)據(jù)再一股腦兒地發(fā)給客戶端。只有當(dāng)瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢,可以把輸出文檔寫入ByteArrayOutputStram,完成后查看其大小,然后把該值放入Content-Length頭,最后通過byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容。
例如: Content-Length: 29837
Content-Encoding
WEB服務(wù)器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應(yīng)中的對象。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。Java的GZIPOutputStream可以很方便地進(jìn)行g(shù)zip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet應(yīng)該通過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。
例如:Content-Encoding:gzip
Content-Language
WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象所用的自然語言。
例如: Content-Language:da。沒有設(shè)置該域則認(rèn)為實(shí)體內(nèi)容將提供給所有的語言閱讀。
Server
指明HTTP服務(wù)器用來處理請求的軟件信息。
例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多個產(chǎn)品標(biāo)識和注釋,產(chǎn)品標(biāo)識一般按照重要性排序。
X-AspNet-Version
如果網(wǎng)站是用ASP.NET開發(fā)的,這個header用來表示ASP.NET的版本。
例如: X-AspNet-Version: 4.0.30319
X-Powered-By
表示網(wǎng)站是用什么技術(shù)開發(fā)的。
例如:X-Powered-By: ASP.NET
Connection
例如:
Connection: keep-alive,當(dāng)一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接。
Connection: close,代表一個Request完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關(guān)閉,當(dāng)客戶端再次發(fā)送Request,需要重新建立TCP連接。
Location
用于重定向一個新的位置,包含新的URL地址。表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法,該方法同時設(shè)置狀態(tài)代碼為302。Location響應(yīng)報頭域常用在更換域名的時候。
Refresh
表示瀏覽器應(yīng)該在多少時間之后刷新文檔,以秒計。除了刷新當(dāng)前文檔之外,你還可以通過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。注意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實(shí)現(xiàn),這是因?yàn)?,自動刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要。但是,對于Servlet來說,直接設(shè)置Refresh頭更加方便。注意Refresh的意義是“N秒之后刷新本頁面或訪問指定頁面”,而不是“每隔N秒刷新本頁面或訪問指定頁面”。因此,連續(xù)刷新要求每次都發(fā)送一個Refresh頭,而發(fā)送204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>。注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分,而是一個擴(kuò)展,但Netscape和IE都支持它。
HTTPS
HTTPS
Hypertext Transfer Protocol over Secure Socket Layer,是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入TLS層,HTTPS的安全基礎(chǔ)是TLS。
SSL
Secure Socket Layer,安全套接字層,1994年為 Netscape 所研發(fā),SSL 協(xié)議位于 TCP/IP 協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持,目前逐漸廢棄了。
TLS
Transport Layer Security,傳輸層安全,其前身是 SSL,它最初的幾個版本(SSL 1.0、SSL 2.0、SSL 3.0)由網(wǎng)景公司開發(fā),1999年從 3.1 開始被 IETF 標(biāo)準(zhǔn)化并改名,發(fā)展至今已經(jīng)有 TLS 1.0、TLS 1.1、TLS 1.2 三個版本。SSL3.0和TLS1.0由于存在安全漏洞,已經(jīng)很少被使用到。TLS 1.3 改動會比較大,目前還在草案階段,目前使用最廣泛的是TLS 1.1、TLS 1.2。

兩種加密算法
對稱加密
密鑰只有一個,加密解密為同一個密碼,且加解密速度快,典型的對稱加密算法有DES、AES等。
非對稱加密
密鑰成對出現(xiàn)(且根據(jù)公鑰無法推知私鑰,根據(jù)私鑰也無法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密),相對對稱加密速度較慢,典型的非對稱加密算法有RSA、DSA等。

證書包括內(nèi)容:
- (1)證書的發(fā)布機(jī)構(gòu)CA
- (2)證書的有效期
- (3)公鑰
- (4)證書所有者
- (5)簽名
客戶端在接受到服務(wù)端發(fā)來的SSL證書時,會對證書的真?zhèn)芜M(jìn)行校驗(yàn),以瀏覽器為例說明如下:
- (1)首先瀏覽器讀取證書中的證書所有者、有效期等信息進(jìn)行一一校驗(yàn)
- (2)瀏覽器開始查找操作系統(tǒng)中已內(nèi)置的受信任的證書發(fā)布機(jī)構(gòu)CA,與服務(wù)器發(fā)來的證書中的頒發(fā)者CA比對,用于校驗(yàn)證書是否為合法機(jī)構(gòu)頒發(fā)
所以通過發(fā)送SSL證書的形式,既解決了公鑰獲取問題,又解決了黑客冒充問題,一箭雙雕,HTTPS加密過程也就此形成
所以相比HTTP,HTTPS 傳輸更加安全
- (1) 所有信息都是加密傳播,黑客無法竊聽。
- (2) 具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方會立刻發(fā)現(xiàn)。
- (3) 配備身份證書,防止身份被冒充。
HTTPS 缺點(diǎn):
- SSL 證書費(fèi)用很高,以及其在服務(wù)器上的部署、更新維護(hù)非常繁瑣
- HTTPS 降低用戶訪問速度(多次握手)
- 網(wǎng)站改用HTTPS 以后,由HTTP 跳轉(zhuǎn)到 HTTPS 的方式增加了用戶訪問耗時(多數(shù)網(wǎng)站采用302跳轉(zhuǎn))
- HTTPS 涉及到的安全算法會消耗 CPU 資源,需要增加大量機(jī)器(https訪問過程需要加解密)
- 如果找不到,瀏覽器就會報錯,說明服務(wù)器發(fā)來的證書是不可信任的。
- 如果找到,那么瀏覽器就會從操作系統(tǒng)中取出 頒發(fā)者CA 的公鑰,然后對服務(wù)器發(fā)來的證書里面的簽名進(jìn)行解密
- 瀏覽器使用相同的hash算法計算出服務(wù)器發(fā)來的證書的hash值,將這個計算的hash值與證書中簽名做對比
- 對比結(jié)果一致,則證明服務(wù)器發(fā)來的證書合法,沒有被冒充
- 此時瀏覽器就可以讀取證書中的公鑰,用于后續(xù)加密了
綜上所述,相比 HTTP 協(xié)議,HTTPS 協(xié)議增加了很多交互、加密解密等流程,保證數(shù)據(jù)傳輸?shù)陌踩?,很大程度上避免了黑客的攻擊?/p>