HTTP協議(Requset、Response)
目錄
http協議
對瀏覽器客戶端 和 伺服器端 之間資料傳輸的格式規範。
基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)
無狀態, 但是可用cookie技術在請求和響應報文中寫入cookie資訊來控制客戶端的狀態。
連線步驟:
域名解析 --> 發起TCP的3次握手 --> 建立TCP連線後發起http請求 --> 伺服器返回http響應,瀏覽器得到html程式碼 --> 瀏覽器解析html程式碼,並請求html程式碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給使用者
檢視http協議報文的方法:
- 使用火狐的firebug外掛(右鍵->firebug->網路)
- 使用谷歌的“審查元素”
- 使用系統自帶的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(獲取資源)
- GET方法用來查詢,不會對瀏覽器上的資訊產生影響
- 引數資料跟在位址列(URI)後。以?開頭、多個引數之間以&分割:GET /WebRoot/testMethod.html?name=123&password=123456HTTP/1.1
- GET提交引數資料有限制,不超過1KB。(實際上URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制,IE對URL長度的限制是2083位元組)
- GET方式採用的是明文傳輸,不適合提交敏感密碼。
- 注意: 瀏覽器直接訪問的請求,預設提交方式是GET方式。火狐瀏覽器以Get方式提交帶引數的資料,會重複提交兩次
POST(傳輸實體主體)
- 引數跟在請求的實體內容中。沒有?開頭、多個引數之間以&分割
- POST提交的引數資料沒有限制。
- 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協議安全