HTTP(Hyper Text Transfer Protocol:超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連接方式,HTTP1.1版本中給出一種持續連接的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。
HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。
HTTP協議的主要特點可概括如下:
-
支持客戶/服務器模式。
-
簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
-
靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
-
無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
-
無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
HTTP協議--URL
HTTP URL (URL是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息)的格式如下:
http://host[":"port][abs_path]
http表示要通過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用缺省端口80;abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。
eg:
1、輸入:www.baidu.com
瀏覽器自動轉換成:http://www.baidu.com
2、http://127.0.0.1:8080/login.html
HTTP協議--工作過程
一次HTTP操作稱為一個事務,其工作整個過程如下:
-
地址解析
如用客戶端瀏覽器請求這個頁面:http://localhost.com:8080/index.htm
從中分解出協議名、主機名、端口、對象路徑等部分,對於我們的這個地址,解析得到的結果如下:
協議名:http
主機名:localhost.com
端口:8080
對象路徑:/index.htm
在這一步,需要域名系統DNS解析域名localhost.com,得主機的IP地址。
2)封裝HTTP請求數據包
把以上部分結合本機自己的信息,封裝成一個HTTP請求數據包
3)封裝成TCP包,建立TCP連接(TCP的三次握手)
在HTTP工作開始之前,客戶機(Web瀏覽器)首先要通過網絡與服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之后才能進行更高層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80。這里是8080端口
4)客戶機發送請求命令
建立連接后,客戶機發送一個請求給服務器,請求方式的格式為:統一資源標識符(URI:Uniform Resource Identifier)、協議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可能的內容
5)服務器響應
服務器接到請求后,給予相應的響應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。
實體消息是服務器向瀏覽器發送頭信息后,它會發送一個空白行來表示頭信息的發送到此結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據
6)服務器關閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送后將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬。
HTTP協議--請求方法
HTTP請求方法有多種,各個方法的解釋如下:
-
GET:獲取資源
GET方法用來請求訪問已被URI識別的資源。也就是指定了服務器處理請求之后響應的內容以?分割URL和傳輸數據,參數之間以&相連
Eg : http://dev-his.seenew.info/newDoctorStation/StationLayoutEdit?k=123551-23-XN900128&tem=495&edit=false
-
POST:傳輸實體主體
POST方法用來傳輸實體主體。POST與GET的區別之一就是目的不同,雖然GET方法也可以傳輸,但是一般不用,因為GET的目的是獲取,POST的目的是傳輸。
-
PUT:傳輸文件
PUT方法用來傳輸文件。類似FTP協議,文件內容包含在請求報文的實體中,然后請求保存到URL指定的服務器位置。
-
HEAD:獲得報文首部
HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回數據。用於確認URI的有效性及資源更新時間等。
-
DELETE:刪除文件
DELETE方法用來刪除文件,是與PUT相反的方法。DELETE是要求返回URL指定的資源。
-
OPTIONS:詢問支持的方法
因為並不是所有的服務器都支持規定的方法,為了安全有些服務器可能會禁止掉一些方法例如DELETE、PUT等。那么OPTIONS就是用來詢問服務器支持的方法。
-
TRACE:追蹤路徑
TRACE方法是讓Web服務器將之前的請求通信環回給客戶端的方法。這個方法並不常用。
-
CONNECT:要求用隧道協議連接代理
CONNECT方法要求在與代理服務器通信時建立隧道,實現用隧道協議進行TCP通信。主要使用SSL/TLS協議對通信內容加密后傳輸。
GET和POST區別
-
GET和POST都是客戶端向服務器發送請求的一種方法
-
GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,POST方法是把提交的數據放在HTTP包的Body中。eg: http://dev-his.seenew.info/newDoctorStation/StationLayoutEdit?k=123551-23-XN900128&tem=495&edit=false
-
GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
-
GET提交的數據大小有限制,最多只能有1024字節(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制。
-
安全性:
-
GET就像查詢一樣,只讀不寫不更改資源,POST是向服務器提交數據,提交后,資源已經發生變化
-
GET的請求數據附在URL后面,可以在地址欄看到,如果瀏覽器不清除記錄,容易被人獲取到賬號密碼,而POST是把提交的數據放在實體主體中的,一般用戶端(web)無法查看,所以相對來說安全點
-
GET提交的請求,數字和英文,會原樣發送,如果是空格,會轉換成+,如果是中文或者其他字符,需要用base64加密(如果是+,容易被攔截)得到類似於%E4%BD%A0%E5%A5%BD這樣的數據
HTTP協議--響應狀態碼
接收和解釋請求消息后,服務器返回一個HTTP響應消息。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態代碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
HTTP協議--請求報頭
請求報頭(Request Headers):
常用的請求報頭
-
Accept
Accept請求報頭域用於指定客戶端接受哪些類型的信息。eg:Accept:application/json ,表明客戶端希望接受josn格式的資源;Accept:text/html,表明客戶端希望接受html文本。
-
Accept-Charset
Accept-Charset請求報頭域用於指定客戶端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受。
-
Accept-Encoding
Accept-Encoding請求報頭域類似於Accept,但是它是用於指定可接受的內容編碼。eg:Accept-Encoding:gzip.deflate.如果請求消息中沒有設置這個域服務器假定客戶端對各種內容編碼都可以接受。
-
Accept-Language
Accept-Language請求報頭域類似於Accept,但是它是用於指定一種自然語言。eg:Accept-Language:zh-cn.如果請求消息中沒有設置這個報頭域,服務器假定客戶端對各種語言都可以接受。
-
Authorization
Authorization請求報頭域主要用於證明客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,如果收到服務器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。eg:Bearer 4dfc0a15-0ce1-43a1-9bed-3b09e5363f8d
-
Host(發送請求時,該報頭域是必需的)
Host請求報頭域主要用於指定被請求資源的Internet主機和端口號,它通常從HTTP URL中提取出來的
-
Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。
-
Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優點,當頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現這一點,Servlet需要在應答中發送一個Content-Length頭,最簡單的實現方法是:先把內容寫入ByteArrayOutputStream,然后在正式寫出內容之前計算它的大小;
-
Cache-Control:指定請求和響應遵循的緩存機制。
-
Cache-Control:Public 可以被任何緩存所緩存
-
Cache-Control:Private 內容只緩存到私有緩存中
-
Cache-Control:no-cache 所有內容都不會被緩存
-
Cache-Control:no-store 用於防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。
-
Cache-Control:max-age 指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
-
Cache-Control:min-fresh 指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。
-
Cache-Control:max-stale 指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內的響應消息。
-
Content-Length:表示請求消息正文的長度;
-
Pragma:指定“no-cache”值表示服務器必須返回一個刷新后的文檔,即使它是代理服務器而且已經有了頁面的本地拷貝
-
Content-Type:標明發送或者接收的實體的MIME類型。Eg:text/html; charset=GB2312 主類型/子類型;
Eg:application/json; charset=UTF-8
-
Origin:標識跨域資源請求(請求服務端設置Access-Control-Allow-Origin響應字段)
-
User-Agent
User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。不過,這個報頭域不是必需的,如果我們自己編寫一個瀏覽器,不使用User-Agent請求報頭域,那么服務器端就無法得知我們的信息了。
Eg:
POST /app-station-manage/orderCommon/listDict HTTP/1.1
Host: xxxxxxxxxxxxxx
Connection: keep-alive
Content-Length: 40
Pragma: no-cache
Cache-Control: no-cache
k2: 23
Origin:xxxxxxxxx
Authorization: Bearer 4dfc0a15-0ce1-43a1-9bed-3b09e5363f8d
Content-Type: application/json; charset=UTF-8
Accept: application/json
k1: xxxxxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer:http:xxxxxxxxxxxx
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
HTTP協議--響應報頭
-
Access-Control-Allow-Methods: 服務器支持哪些請求方法
-
Date:表示消息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標准時,換算成本地時間,需要知道用戶所在的時區。你可以用setDateHeader來設置這個頭以避免轉換時間格式的麻煩
-
Expires:指明應該在什么時候認為文檔已經過期,從而不再緩存它,重新從服務器獲取,會更新緩存。過期之前使用本地緩存。HTTP1.1的客戶端和緩存會將非法的日期格式(包括0)看作已經過期。eg:為了讓瀏覽器不要緩存頁面,我們也可以將Expires實體報頭域,設置為0。
-
Transfer-Encoding:告知接收端,報文采取了何種編碼,chunked表示服務器無法確定消息大小,一般比如下載等,就采用chunked。X-Application-Context: application配置,這里表示讀取的是application-prod.properties
-
X-Content-Type-Options: 是用來禁用瀏覽器內容嗅探行為。
nosniff
下面兩種情況的請求將被阻止:
請求類型是"style" 但是 MIME 類型不是 "text/css",
請求類型是"script" 但是 MIME 類型不是 JavaScript MIME 類型。
-
Server:首部包含了處理請求的源頭服務器所用到的軟件相關信息。
-
X-Frame-Options:
用來給瀏覽器指示允許一個頁面可否在 <frame>, <iframe> 或者 <object> 中展現的標記。網站可以使用此功能,來確保自己網站的內容沒有被嵌到別人的網站中去,也從而避免了點擊劫持 (clickjacking) 的攻擊
DENY
表示該頁面不允許在 frame 中展示,即便是在相同域名的頁面中嵌套也不允許。
SAMEORIGIN
表示該頁面可以在相同域名頁面的 frame 中展示。
ALLOW-FROM uri
表示該頁面可以在指定來源的 frame 中展示。
-
X-XSS-Protection:
響應頭是Internet Explorer,Chrome和Safari的一個功能,當檢測到跨站腳本攻擊 (XSS)時,瀏覽器將停止加載頁面。雖然這些保護在現代瀏覽器中基本上是不必要的,當網站實施一個強大的Content-Security-Policy來禁用內聯的JavaScript ('unsafe-inline')時, 他們仍然可以為尚不支持 CSP 的舊版瀏覽器的用戶提供保護。
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
-
0
禁止XSS過濾。
-
1
啟用XSS過濾(通常瀏覽器是默認的)。如果檢測到跨站腳本攻擊,瀏覽器將清除頁面(刪除不安全的部分)。
-
1;mode=block
啟用XSS過濾。如果檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
-
1; report=<reporting-URI> (Chromium only)
啟用XSS過濾。如果檢測到跨站腳本攻擊,瀏覽器將清除頁面並使用CSP report-uri指令的功能發送違規報告。
Eg:
HTTP/1.1 200
Server: nginx/1.14.2
Date: Thu, 20 Jun 2019 11:15:29 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
X-Application-Context: app-station-manage:dev:8414
Access-Control-Allow-Methods: GET, POST, OPTIONS