之前學習javaWeb只是大致了解了一下,今天重點介紹下http請求,當是復習吧!
一、http基礎概念
1、什么是http協議?
HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。它的發展是萬維網協會(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)合作的結果,(他們)最終發布了一系列的RFC,RFC 1945定義了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個版本——HTTP 1.1。
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網絡傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
2、http響應模型
HTTP協議永遠都是客戶端發起請求,服務器回送響應。見下圖所示:

這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,服務器將消息推送給客戶端。
3、工作流程
一次HTTP操作稱為一個事務,其工作過程可分為四步:
1)首先客戶機與服務器需要建立連接。只要單擊某個超級鏈接,HTTP的工作開始。
2)建立連接后,客戶機發送一個請求給服務器,請求方式的格式為:統一資源標識符(URL)、協議版本號,后邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
3)服務器接到請求后,給予相應的響應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,后邊是MIME信息包括服務器信息、實體信息和可能的內容。
4)客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機與服務器斷開連接。
如果在以上過程中的某一步出現錯誤,那么產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來說,這些過程是由HTTP自己完成的,用戶只要用鼠標點擊,等待信息顯示就可以了。
二、http請求
2.1、HTTP請求包括的內容
客戶端連上服務器后,向服務器請求某個web資源,稱之為客戶端向服務器發送了一個HTTP請求。
一個完整的HTTP請求包括如下內容:一個請求行、若干消息頭、以及實體內容
范例:

2.2、HTTP請求的細節——請求行
請求行中的GET稱之為請求方式,請求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
用戶如果沒有設置,默認情況下瀏覽器向服務器發送的都是get請求,例如在瀏覽器直接輸地址訪問,點超鏈接訪問等都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現。
不管POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表現在數據傳遞上:如果請求方式為GET方式,則可以在請求的URL地址后以?的形式帶上交給服務器的數據,多個數據之間以&進行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特點:在URL地址后附帶的參數是有限制的,其數據容量通常不能超過1K。
如果請求方式為POST方式,則可以在請求的實體內容中向服務器發送數據,Post方式的特點:傳送的數據量無限制。
2.3、HTTP請求的細節——消息頭
HTTP請求中的常用消息頭
accept:瀏覽器通過這個頭告訴服務器,它所支持的數據類型
Accept-Charset: 瀏覽器通過這個頭告訴服務器,它支持哪種字符集
Accept-Encoding:瀏覽器通過這個頭告訴服務器,支持的壓縮格式
Accept-Language:瀏覽器通過這個頭告訴服務器,它的語言環境
Host:瀏覽器通過這個頭告訴服務器,想訪問哪台主機
If-Modified-Since: 瀏覽器通過這個頭告訴服務器,緩存數據的時間
Referer:瀏覽器通過這個頭告訴服務器,客戶機是哪個頁面來的 防盜鏈
Connection:瀏覽器通過這個頭告訴服務器,請求完后是斷開鏈接還是何持鏈接
例如:
1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, 2 application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 3 Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp 4 Accept-Language: zh-CN 5 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3) 6 Accept-Encoding: gzip, deflate 7 Host: localhost:8080 8 Connection: Keep-Alive
三、HTTP響應
3.1、HTTP響應包括的內容
一個HTTP響應代表服務器向客戶端回送的數據,它包括: 一個狀態行、若干消息頭、以及實體內容 。

范例:
1 HTTP/1.1 200 OK 2 Server: Apache-Coyote/1.1 3 Content-Type: text/html;charset=ISO-8859-1 4 Content-Length: 105 5 Date: Tue, 27 May 2014 16:23:28 GMT 6 7 <html> 8 <head> 9 <title>Hello World JSP</title> 10 </head> 11 <body> 12 Hello World! 13 14 </body> 15 </html>
3.2、HTTP響應的細節——狀態行
狀態行格式: HTTP版本號 狀態碼 原因敘述<CRLF>
舉例:HTTP/1.1 200 OK
狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分為5類,如下所示:
3.3、HTTP響應細節——常用響應頭
HTTP響應中的常用響應頭(消息頭)
Location: 服務器通過這個頭,來告訴瀏覽器跳到哪里
Server:服務器通過這個頭,告訴瀏覽器服務器的型號
Content-Encoding:服務器通過這個頭,告訴瀏覽器,數據的壓縮格式
Content-Length: 服務器通過這個頭,告訴瀏覽器回送數據的長度
Content-Language: 服務器通過這個頭,告訴瀏覽器語言環境
Content-Type:服務器通過這個頭,告訴瀏覽器回送數據的類型
Refresh:服務器通過這個頭,告訴瀏覽器定時刷新
Content-Disposition: 服務器通過這個頭,告訴瀏覽器以下載方式打數據
Transfer-Encoding:服務器通過這個頭,告訴瀏覽器數據是以分塊方式回送的
Expires: -1 控制瀏覽器不要緩存
Cache-Control: no-cache
Pragma: no-cache
四、在服務端設置響應頭來控制客戶端瀏覽器的行為
4.1、設置Location響應頭,實現請求重定向
1 import javax.servlet.http.HttpServletRequest; 2 import javax.servlet.http.HttpServletResponse; 3 4 public class ServletDemo01 extends HttpServlet { 5 private static final long serialVersionUID = 1L; 6 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 7 this.doPost(request, response); 8 } 9 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 /** 11 * 設置服務器狀態響應碼:請求資源移動新地址 12 */ 13 response.setStatus(302); 14 /** 15 * 通過設置Location告訴瀏覽器跳轉到哪里,所謂的請求重定向 16 */ 17 response.setHeader("Location", "/http_study/1.jsp"); 18 } 19 20 }
當在瀏覽器中使用URL地址"http://localhost:8080/http_study/ServletDemo01"訪問ServletDemo01時,服務器返回一個302狀態碼告訴瀏覽器,你要的資源我沒有,但是我通過Location響應頭告訴你哪里有,而瀏覽器解析響應頭Location后知道要跳轉到//http_study/1.jsp頁面,所以就會自動跳轉到1.jsp,如下圖所示:

4.2、設置Content-Encoding響應頭,告訴瀏覽器數據的壓縮格式
1 package servlet; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 import java.util.zip.GZIPOutputStream; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ServletDemo02 extends HttpServlet { 12 private static final long serialVersionUID = 1L; 13 14 protected void doGet(HttpServletRequest request, 15 HttpServletResponse response) throws ServletException, IOException { 16 this.doPost(request, response); 17 } 18 19 protected void doPost(HttpServletRequest request, 20 HttpServletResponse response) throws ServletException, IOException { 21 String data = "我是asadfdsf我是asadfdsf我是asadfds" 22 + "f我是asadfdsf我是asadfdsf" 23 + "我是asadfdsf我是asadfdsf我是" 24 + "asadfdsf我是asadfdsf我是asadfd" 25 + "sf我是asadfdsf我是asadfdsf我是as" 26 + "adfdsf我是asadfdsf我是asadfdsf我是" 27 + "asadfdsf我是asadfdsf我是asadfdsf" 28 + "我是asadfdsf我是asadfdsf我是asadfd" 29 + "sf我是asadfdsf我是asadfdsf我是asa" 30 + "dfdsf我是asadfdsf我是asadfdsf我是a" 31 + "sadfdsf我是asadfdsf我是asadfdsf我是" 32 + "asadfdsf我是asadfdsf我是asadfdsf我是" 33 + "asadfdsf我是asadfdsf我是asadfdsf我是" 34 + "asadfdsf我是asadfdsf我是asadfdsf我是" 35 + "asadfdsf我是asadfdsf我是asadfdsf我是a" 36 + "sadfdsf我是asadfdsf我是asadfdsf"; 37 38 System.out.println("壓縮前大小:"+data.getBytes().length); 39 /** 40 * 開始壓縮 41 */ 42 ByteArrayOutputStream bout=new ByteArrayOutputStream(); 43 GZIPOutputStream gout=new GZIPOutputStream(bout); 44 gout.write(data.getBytes()); 45 gout.close(); 46 //得到壓縮數據 47 byte []b=bout.toByteArray(); 48 response.setHeader("Content-Encoding", "gzip"); 49 response.setHeader("Content-Length", b.length+""); 50 response.getOutputStream().write(b); 51 52 } 53 54 }
這里使用GZIPOutputStream流來壓縮數據
當在瀏覽器中使用URL地址"http://localhost:8080/http_study/ServletDemo02"訪問ServletDemo02時,可以看到請求頭信息如下:


4.3、設置content-type響應頭,指定回送數據類型
瀏覽器能接收(Accept)的數據類型有:
application/x-ms-application,
image/jpeg,
application/xaml+xml,
image/gif,
image/pjpeg,
application/x-ms-xbap,
application/vnd.ms-excel,
application/vnd.ms-powerpoint,
application/msword,
1 package servlet; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class ServletDemo03 extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 15 this.doPost(request, response); 16 } 17 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 19 //使用content-type指定發送給瀏覽器的數據類型為image/jpeg 20 response.setHeader("content-type", "image/jpeg"); 21 //獲取流 22 InputStream in=request.getServletContext().getResourceAsStream("/images/1.jpg"); 23 //InputStream in=new InputStream("/images/1.jpg"); 24 byte[] b=new byte[1024]; 25 int ln=0; 26 OutputStream os=response.getOutputStream(); 27 while((ln=in.read(b))!=-1){ 28 os.write(b,0,ln); 29 } 30 } 31 32 }
得到的響應為如圖:

運行結果如下:

4.4、設置content-disposition響應頭,讓瀏覽器下載文件
package servlet; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo04 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 設置content-disposition響應頭,讓瀏覽器下載文件 */ response.setHeader("content-disposition", "attachment;filename="+"1.jpg"); InputStream in=request.getServletContext().getResourceAsStream("images/1.jpg"); byte []b=new byte[1024]; OutputStream os=response.getOutputStream(); int len=0; while((len=in.read())!=-1){ os.write(b,0,len); } } }
在瀏覽器中訪問localhost:8080/http_study/ServletDemo04就會彈出文件下載框,如下圖所示:


