深刻淺出學習HTTP協議

以前學習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請求

2.一、HTTP請求包括的內容

  客戶端連上服務器後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求

一個完整的HTTP請求包括以下內容:一個請求行、若干消息頭、以及實體內容
範例:

  

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.三、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

 

3、HTTP響應

3.一、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.二、HTTP響應的細節——狀態行

    狀態行格式: HTTP版本號 狀態碼 緣由敘述<CRLF>
      舉例:HTTP/1.1 200 OK
  狀態碼用於表示服務器對請求的處理結果,它是一個三位的十進制數。響應狀態碼分爲5類,以下所示:
  

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、在服務端設置響應頭來控制客戶端瀏覽器的行爲

4.一、設置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.二、設置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.三、設置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.四、設置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就會彈出文件下載框,以下圖所示:

相關文章
相關標籤/搜索