HTTP協議

HTTP協議簡介html

1.WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循必定的規則,這個規則就是HTTP協議。java

2.HTTP是HyperText Transfer Protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於描述客戶端與服務器間的數據傳遞。瀏覽器

3.HTTP的版本有1.0和1.1緩存

1.0的特色:每次請求服務器上的資源都要創建新的鏈接,響應完畢後會關閉鏈接,是無狀態的協議。安全

1.1的特色:在一次TCP/IP鏈接的基礎上能夠發出屢次請求和獲得屢次的響應。比1.0多了一些請求和響應頭。服務器

HTTP協議的組成部分app

1.請求部分dom

GET /App1/1.html HTTP/1.1jsp

Accept: */*編碼

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET                CLR 3.0.4506.2152; .NET CLR 3.5.30729)

Host: localhost:8080

Connection: Keep-Alive

                                    

username=admin&password=123

請求部分由三個部分組成:

請求行:位於第一行

請求消息頭:從第二行開始至第一個空行結束

請求正文:從第一個空行以後的都是正文

2.響應部分

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Accept-Ranges: bytes

ETag: W/"65-1366335797484"

Last-Modified: Fri, 19 Apr 2013 01:43:17 GMT

Content-Type: text/html

Content-Length: 65

Date: Fri, 19 Apr 2013 02:06:23 GMT

 

hello http

<a href="b.html">click</a>

<img src="1.jpg"/>

響應部分由三部分組成的:

響應行:位於第一行

響應消息頭:從第二行開始至第一個空行結束

響應正文:從第一個空行以後的都是正文

HTTP協議詳解

1.請求行:GET /App1/1.html HTTP/1.1

GET:請求方式。默認的請求方式。其餘經常使用的請求方式還有POST。

         GET的特色:默認的請求方式。

                                     /App1/c.html?username=sdsfds&password=234324

                                     把表單的請求的數據放在了請求的URI的後面。

                                     缺點:暴露數據、請求行長度有限。

         POST的特色:藉助HTML中的form表單。

                                     請求參數出如今正文部分。長度沒有限制,相對安全。

/App1/1.html:請求的資源的URI

HTTP/1.1:客戶端使用的協議的版本

2.響應行:HTTP/1.1 200 OK

HTTP/1.1:服務器使用的版本協議

200:響應碼。表明服務器處理的結果的一種表示

         200:正常

         302/307:重定向

         304:服務器的資源沒有被修改

         404:請求的資源不存在

         500:服務器出錯了

OK:響應碼描述

3.請求消息頭:向服務器傳遞附加信息

Accept:通知服務器,瀏覽器能夠接受的MIME類型。

Accept-Charset:通知服務器,瀏覽器支持的字符集

Accept-Encoding:通知服務器,瀏覽器可以解碼的數據壓縮方式。好比:gzip

Accept-language:通知服務器,所但願的語言

Host:請求的主機和端口

Referer:是一個URL地址。取值是當前頁面以前的那個頁面的地址。防盜鏈

Content-Type:通知服務器,請求正文的MIME類型。

If-Modified-Since:通知服務器,緩存的文件的最後修改時間。

User-Agent:通知服務器,瀏覽器類型

Content-Length:表示請求消息正文的長度。

Connection:表示是否須要持久鏈接。

 

4.響應消息頭

Location:通知客戶端,指示新的資源的位置(結合302/307來用。請求重定向)

eg:

package cn.lsl.http.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setStatus(302);    //設置響應碼
        response.setHeader("Location", "/Http/index.jsp");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }
}

Server:通知客戶端,服務器的類型

Content-Encoding:通知客戶端,響應正文的壓縮編碼方式。經常使用的gzip。

package cn.lsl.http.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String  data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte b[] = data.getBytes();
        System.out.println("原始數據的大小:"+b.length);
        //GZIP壓縮
        //帶有緩存的字節內存輸出流
        ByteArrayOutputStream out = new ByteArrayOutputStream();                              
     GZIPOutputStream gout = new GZIPOutputStream(out); gout.write(b); gout.close(); b = out.toByteArray(); System.out.println("壓縮後的數據大小:"+b.length); response.setHeader("Content-Encoding", "gzip");//通知客戶端數據的壓縮編碼 response.setHeader("Content-Length", b.length+""); response.getOutputStream().write(b);//輸出相應正文 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }

Content-Length:通知客戶端響應正文的數據大小。

Content-Type:通知客戶端響應正文的MIME類型

Refresh:讓瀏覽器自動刷新。取值爲正數(刷新的時間間隔,單位是秒)

                   Refresh:3

                   Refresh:3;URL=其餘資源的URI

eg:

package cn.lsl.http.servlet;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo3 extends HttpServlet {
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Random r = new Random();
        String data = r.nextInt()+"";
        //response.setHeader("Refresh", "1");//間隔1秒刷新到本身
        response.setHeader("Refresh", "3;URL=/Http/index.jsp");//3秒後刷新到其餘資源
        response.getOutputStream().write(data.getBytes());
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}

Content-Disposition:通知客戶端,如下載的方式打開資源。

package cn.lsl.http.servlet;

import java.io.FileInputStream;
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 ServletDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filePath = getServletContext().getRealPath("/1.jpg");
        //通知客戶端如下載的方式打開
        response.setHeader("Content-Disposition", "attachment;filename=1.jpg");
        response.setHeader("Content-Type", "application/octet-stream");
        InputStream in = new FileInputStream(filePath);
        OutputStream out = response.getOutputStream();
        int len = -1;
        byte b[] = new byte[1024];
        while((len=in.read(b))!=-1){
            out.write(b, 0, len);
        }
        in.close();
        out.close();
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }
}

如下三個一塊兒用,通知客戶端不要緩存

Expires:-1                   網頁的有效時間。單位是毫秒

Cache-Control:no-cache

Pragma:no-cache

eg:

package cn.lsl.http.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "aaaaaaaaaaaaaaaaaaa";
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        response.getOutputStream().write(data.getBytes());
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}
相關文章
相關標籤/搜索