1. 程式人生 > >HTTP協議(Requset、Response)

HTTP協議(Requset、Response)

目錄

http協議

對瀏覽器客戶端 和 伺服器端 之間資料傳輸的格式規範。

基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)

無狀態, 但是可用cookie技術在請求和響應報文中寫入cookie資訊來控制客戶端的狀態。

連線步驟:

域名解析 --> 發起TCP的3次握手 --> 建立TCP連線後發起http請求 --> 伺服器返回http響應,瀏覽器得到html程式碼 --> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給使用者

檢視http協議報文的方法:

  1. 使用火狐的firebug外掛(右鍵->firebug->網路)
  2. 使用谷歌的“審查元素”
  3. 使用系統自帶的telnet工具(遠端訪問工具) 
    a)telnet localhost 8080 訪問tomcat伺服器
    b)ctrl+] 回車 可以看到回顯
    c)輸入請求內容

    d)回車,即可檢視到伺服器響應資訊

http報文解析:

requset請求 資料格式

Http請求報文(瀏覽器->伺服器)

例:表單提交

<form action="提交地址" method="GET/POST">
    使用者名稱:<input type="text" name="username"><br>
    密碼:<input type="text" name="password"><br>
    <input type="submit" value="登入"/>
<form>

點選登陸後檢視HTTP報文: 

擷取http請求報文分析:

GET /WebRoot/hello HTTP/1.1                       -- 請求行
Host: localhost:8080                              -- 請求頭(多個key-value物件)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
                                                  -- 一個空行
username=123&password=123456                          --(post)請求正文/實體內容

----------------------------------------------------------------------------請求行-----------------------------------------------------------------------------------

GET   /WebRoot/hello   HTTP/1.1 

開始訪問資源請求一次,之後檔案中每有一個地址都會請求一次

#http協議版本

http1.0:當前瀏覽器客戶端與伺服器端建立連線之後,只能傳送一次請求,一次請求之後連線關閉。

http1.1:預設使用長連線,當前瀏覽器客戶端與伺服器端建立連線之後,可以在一次連線中傳送多次請求。(基本都使用1.1)

#請求資源

URL: 統一資源定位符。http://localhost:8080/WebRoot/hello。只能定位網際網路資源。是URI 的子集。URL=協議+主機埠+URI

URI: 統一資源標記符。/WebRoot/hello。用於標記任何資源。可以是本地檔案系統、區域網的資源、 可以是網際網路資源。

#請求方式

常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE

常用的請求方式: GET 和 POST

GET(獲取資源

  1. GET方法用來查詢,不會對瀏覽器上的資訊產生影響
  2. 引數資料跟在位址列(URI)後。以?開頭、多個引數之間以&分割:GET  /WebRoot/testMethod.html?name=123&password=123456HTTP/1.1
  3. GET提交引數資料有限制,不超過1KB。(實際上URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制,IE對URL長度的限制是2083位元組)
  4. GET方式採用的是明文傳輸,不適合提交敏感密碼。
  5. 注意: 瀏覽器直接訪問的請求,預設提交方式是GET方式。火狐瀏覽器以Get方式提交帶引數的資料,會重複提交兩次

POST(傳輸實體主體

  1. 引數跟在請求的實體內容中。沒有?開頭、多個引數之間以&分割
  2. POST提交的引數資料沒有限制。
  3. POST方式放在報文內部無法看到,適合提交敏感資料。

------------------------------------------------------------------------------請求頭---------------------------------------------------------------------------

鍵值對,例:常見的請求頭

Accept: text/html,image/*                          -- 瀏覽器接受的內容型別
Accept-Charset: ISO-8859-1                     -- 瀏覽器接受的編碼格式
Accept-Encoding: gzip,compress               --瀏覽器接受的資料壓縮格式
Accept-Language: en-us,zh-                      --瀏覽器接受的語言
Host: www.it315.org:80                 --(必輸)當前請求域名(主機:埠)
Content-Type: application/x-www-form-urlencoded          --提交的資料型別
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT            --瀏覽器最後的快取時間
Referer: http://www.it315.org/index.jsp                               -- 當前請求來自於哪裡(可用來判斷非法連結)
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)            --瀏覽器版本型別
Cookie:name=123                                                               -- 瀏覽器儲存的cookie資訊
Connection: close/Keep-Alive                       -- 瀏覽器跟伺服器連線狀態。close:連線關閉 keep-alive:保持連線
Date: Tue, 11 Jul 2000 18:23:51 GMT          -- 請求發出的時間 

Content-Type  常見的媒體格式型別如下:

    text/html : HTML格式
    text/plain :純文字格式      
    text/xml :  XML格式
    text/x-markdown:markdown格式
    image/gif :gif圖片格式    
    image/jpeg :jpg圖片格式 
    image/png:png圖片格式

application/xhtml+xml :XHTML格式
application/xml : XML資料格式
application/atom+xml :Atom XML聚合格式
application/json : JSON資料格式
application/pdf :pdf格式
application/msword : Word文件格式
application/octet-stream : 二進位制流資料(如常見的檔案下載)
application/x-www-form-urlencoded<form encType="">中預設的encType(表單預設的提交資料的格式)

form表單資料被編碼以鍵值對形式?key1=value1&key2=value2的方式傳送到伺服器

-----------------------------------------------------------------------------空行-------------------------------------------------------------------------------

--------------------------------------------------------------------請求正文/實體內容-------------------------------------------------------------------------

請求頭和請求正文之間是一個空行,它表示請求頭已經結束,接下來的是請求正文。

只有POST提交的引數會放到實體內容中


username=123&password=123456                 --(post)請求正文/實體內容

=======================================Servlet請求物件============================================

HttpServletRequest物件

tomcat伺服器把請求資訊封裝到HttpServletRequest物件,把響應資訊封裝到HttpServletResponse物件。然後呼叫servlet的方法,傳入request和response物件

HttpServletRequest物件用於獲取請求資料,核心的API:

請求行

request.getMethod();          獲取請求方式

request.getRequetURI(); /  request.getRequetURL();            獲取請求資源

request.getProtocol();           獲取請求http協議版本

request.getQueryString();           (獲取GET方式傳遞的引數)

請求頭

request.getHeaderNames();            獲取所有的請求頭名稱

request.getHeader("名稱");            根據請求頭獲取請求值

實體內容

request.getInputStream();            獲取實體內容資料(獲取POST方式傳遞的引數)

GET、POST請求引數 統一通用方便的獲取方法

request.getParameterNames();          獲取所有引數名稱列表(引數名為 html表單中資料標籤的name屬性值)

request.getParameter("引數名");         根據引數名獲取引數值(只能獲取一個值的引數)

request.getParameterValue("引數名“);         根據引數名獲取引數值(可以獲取多個值的引數)

編碼問題

修改GET方式引數編碼:

手動解碼:String name = new String(request.getParameter("引數名").getBytes("iso-8859-1"),"utf-8");

修改POST方式引數編碼:

設定引數查詢碼錶:request.setCharacterEncoding("utf-8");         放在查詢引數之前,只對實體內容起作用

改伺服器配置檔案:找到並在%tomcat%/conf/server.xml檔案Connector標籤中加入  URIEncoding="utf-8"

請求案例:獲取瀏覽器的型別(user-agent), 防止非法連結(referer)

response響應 資料格式

Http響應報文(伺服器->瀏覽器)

HTTP/1.1  200  OK                        --響應行
Server: Apache-Coyote/1.1                --響應頭(key-vaule)
Content-Length: 24
Date: Fri, 30 Jan 2015 01:54:57 GMT
                                         --一個空行
this is hello servlet!!!                 --響應正文/實體內容

-------------------------------------------------------------------------------響應行---------------------------------------------------------------------------

HTTP/1.1  200  OK

#狀態碼: 伺服器處理請求的結果(狀態)

常見的狀態:
200: 表示請求處理完成並完美返回
302: 表示請求需要進一步細化。
404: 表示客戶訪問的資源找不到。
500: 表示伺服器的資源傳送錯誤。(伺服器內部錯誤)
#狀態描述

--------------------------------------------------------------------------------響應頭------------------------------------------------------------------------

鍵值對,例:常見的響應頭

Location: 重定向地址                         --表示重定向的地址,該頭和302的狀態碼一起使用。
Server:apache tomcat                       --表示伺服器的軟體資訊, 它和請求報頭域User-Agent是相對應的
Content-Encoding: gzip                     --表示伺服器傳送給瀏覽器的資料壓縮型別
Content-Length: 80                           --表示伺服器傳送給瀏覽器的實體正文長度
Content-Language: zh-cn                  --表示伺服器支援的語言
Content-Type: text/html; charset=GB2312                       --表示伺服器傳送給瀏覽器的資料型別內容編碼
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT               --表示伺服器資源的最後修改時間
Refresh: 秒數;url=地址                                                     --表示定時重新整理到指定頁面
Content-Disposition: attachment; filename=aaa.zip         --表示告訴瀏覽器以下載方式開啟資源(下載檔案時用到)
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search                    --表示伺服器傳送給瀏覽器的cookie資訊(會話管理用到)
Expires: -1                                                                       --響應過期時間,-1表示通知瀏覽器不進行快取
Cache-Control: no-cache                                                --同上
Pragma: no-cache                                                           --同上
Connection: close/Keep-Alive          --表示伺服器和瀏覽器的連線狀態。close:關閉連線 keep-alive:儲存連線 

-----------------------------------------------------------------------響應正文/實體內容---------------------------------------------------------------------

響應正文就是伺服器返回給瀏覽器的資源的內容:html, css, js,甚至圖片

由響應頭的Content-···等屬性告知瀏覽器 響應正文的長度、編碼、媒體型別等(MIME Type是經過 ietf 組織協商,以 RFC 的形式作為建議標準釋出在網上的)

由response物件PrintWriter寫入資料內容

=======================================Servlet響應物件============================================

HttpServletResponse物件

tomcat伺服器把請求資訊封裝到HttpServletRequest物件,把響應資訊封裝到HttpServletResponse物件。然後呼叫servlet的方法,傳入request和response物件
HttpServletResponse物件用於修改響應資訊,核心的API:

響應行

response.setStatus();           設定狀態碼

響應頭

response.setHeader("name","value");           設定響應頭

response.sendRedirect(url);         重定向

response.setContentType("text/html;charset=utf-8");         傳送給瀏覽器的資料型別內容編碼

實體內容:(瀏覽器直接能夠看到)

response.getWriter().writer();          傳送字元實體內容

response.getOutputStream().writer()          傳送位元組實體內容

tomcat伺服器把response物件的內容轉換成響應格式內容,再發送給瀏覽器解析。

編碼問題

response.setCharacterEncoding("utf-8");         放在響應實體內容程式碼之前,對getOutputStream().writer()位元組流不起作用

響應案例:請求重定向(Location),定時重新整理(refresh),content-Type資料型別(在tomcat伺服器web.xml中用mime-type標籤規定了資料型別,例如:text/html傳送HTML文字;image/jpg傳送圖片)
 

HTTPS協議  是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全