以前學習javaWeb只是大體瞭解了一下,今天重點介紹下http請求,當是複習吧!html
1、http基礎概念java
一、什麼是http協議?web
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服務器傳輸超文本到本地瀏覽器的傳送協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。緩存
二、http響應模型服務器
HTTP協議永遠都是客戶端發起請求,服務器回送響應。見下圖所示:
網絡
這樣就限制了使用HTTP協議,沒法實如今客戶端沒有發起請求的時候,服務器將消息推送給客戶端。app
三、工做流程jsp
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:ide
1)首先客戶機與服務器須要創建鏈接。只要單擊某個超級連接,HTTP的工做開始。
2)創建鏈接後,客戶機發送一個請求給服務器,請求方式的格式爲:統一資源標識符(URL)、協議版本號,後邊是MIME信息包括請求修飾符、客戶機信息和可能的內容。
3)服務器接到請求後,給予相應的響應信息,其格式爲一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後邊是MIME信息包括服務器信息、實體信息和可能的內容。
4)客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接。
若是在以上過程當中的某一步出現錯誤,那麼產生錯誤的信息將返回到客戶端,有顯示屏輸出。對於用戶來講,這些過程是由HTTP本身完成的,用戶只要用鼠標點擊,等待信息顯示就能夠了。
2、http請求
客戶端連上服務器後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求。
一個完整的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方式的特色:傳送的數據量無限制。
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響應表明服務器向客戶端回送的數據,它包括: 一個狀態行、若干消息頭、以及實體內容 。
範例:
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>
狀態行格式: HTTP版本號 狀態碼 緣由敘述<CRLF>
舉例:HTTP/1.1 200 OK
狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類,以下所示:
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
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,以下圖所示:
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時,能夠看到請求頭信息以下:
瀏覽器能接收(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 }
獲得的響應爲如圖:
運行結果以下:
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就會彈出文件下載框,以下圖所示: