1. 程式人生 > >Servlet學習筆記【2】---Http資料包

Servlet學習筆記【2】---Http資料包

本文主要講Http協議相關知識。

1 Http協議特點

單向性:客戶端和服務端是單向通訊的,只有客戶端發請求,服務端才會響應產生。(異於推送模式)

無狀態:協議本身並沒有狀態的記錄,當客戶端多次訪問伺服器時,服務端並不知道你曾經訪問。STP協議是有狀態的(即客戶端連線服務端後,服務端會記錄連線狀態,下次連結繼續上次狀態。例如:下載時支援斷點續傳),而Http是無狀態的,因此需要其它的技術實現狀態記錄(session、cookie)。

2 Http模式下發送請求方式

基於http協議我們能夠採用哪些方式來發送請求呢?常用的有如下四種:

DoGet

DoPost

DoHead

DoDelete

DoGet和DoPost的區別:

1)get方式提交表單表單中的資料會在位址列中顯示。而post方法則不會。例如:百度中輸入java後,位址列中?後邊有個wd=java。注意:在瀏覽器位址列輸入地址方式,永遠是get方式。

2)get方式提交表單長度是有限制的512位元組,而post理論上是無限的。說明:瀏覽器位址列輸入的字元長度是有限的,因此,get方式有長度顯示。

3)get方式提交表單會在http資料包中的第一行出現,而post在空一行的body中出現。

4)get方式永遠是以字元方式提交。而post既可以以字元也可以以位元組。說明1:get方式內容會在瀏覽器輸入框中顯示,因此是字元方式。說明2:當做檔案上傳時,提交必須以post方式;當用戶名和密碼提交時,必須用post方式,因為get會造成資訊洩露。

 3 Http資料包

B/S結構,完全是基於http資料包進行傳遞資訊的(請求和響應)。

3.1 Get方式Http資料包

在serverSockt建立一個伺服器,並將請求的資料包打印出來:

 1 package test1;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class Server {
 9 
10     public static
void main(String[] args) throws Exception { 11 ServerSocket ss = new ServerSocket(8080); 12 Socket s = ss.accept(); 13 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 14 String str; 15 while((str = br.readLine()) != null) { 16 System.out.print(str + '\n'); 17 } 18 } 19 }

執行該程式碼啟動伺服器,在瀏覽器位址列中輸入:http://127.0.0.1:8080/index.html?key=value&key1=value1

在eclipse控制檯中,可以看到如下列印日誌:

 1 GET /index.html?key=value&key1=value1 HTTP/1.1
 2 Host: 127.0.0.1:8080  // 請求地址
 3 Connection: keep-alive
 4 Cache-Control: max-age=0
 5 Upgrade-Insecure-Requests: 1
 6 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, 
 7 like Gecko) Chrome/69.0.3497.100 Safari/537.36
 8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/a   // 瀏覽器支援的檔案格式
 9 png,*/*;q=0.8
10 Accept-Encoding: gzip, deflate, br  //瀏覽器支援的編碼
11 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,de;q=0.6,zh-TW;q=0.5,en-US;  // 瀏覽器支援的語言
12 q=0.4

從上邊日誌可以看出,這是Get方式的Http資料包

3.2 Post方式Http資料包

1)首先建立一個test.html檔案,裡邊有個表單,並且請求方式設定為post:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <form action="http://127.0.0.1:8888" method="post">
 9     <input type="text" name="username" value="zhaoweikai"/>
10     <input type="text" name="userage" value="25"/>
11     <input type="submit" value="提交"/>
12 </form>
13 </body>
14 </html>

2)通過TcpTrace工具,打印出表單提交時的請求Http資料包

首先要配置TcpTrace軟體監聽埠(8888)和目標埠(8080):

說明:tcpTrace是一款小巧的獲取請求報文和響應報文的工具,使用非常簡單。

 3)啟動一個Tomcat服務

Tomcat預設監聽埠8080。如何啟動Tomcat這裡不再說明,可以看這個。

4)在瀏覽器中開啟上邊test.html檔案,點選提交按鈕

5)在TcpTrace軟體中,可以看到Post方式下的Http資料包如下:

 1 POST / HTTP/1.1
 2 Host: 127.0.0.1:8888
 3 Connection: keep-alive
 4 Content-Length: 30
 5 Cache-Control: max-age=0
 6 Upgrade-Insecure-Requests: 1
 7 Origin: null
 8 Content-Type: application/x-www-form-urlencoded
 9 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
11 Accept-Encoding: gzip, deflate, br
12 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,de;q=0.6,zh-TW;q=0.5,en-US;q=0.4
13 
14 username=zhaoweikai&userage=25

從上邊程式碼可以看出,表單資料內容在最後的內容中顯示。

參考資料&內容來源:

速學堂:http://www.sxt.cn/tomcat/1-2-5.html