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 staticvoid 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