1. 程式人生 > 其它 >Http協議以及解決亂碼

Http協議以及解決亂碼

Http協議以及亂碼

什麼是 HTTP 協議

什麼是協議?

協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議。

所謂 HTTP 協議,就是指,客戶端和伺服器之間通訊時,傳送的資料,需要遵守的規則,叫 HTTP 協議。

HTTP 協議中的資料又叫報文。

請求的 HTTP 協議

客戶端給伺服器傳送資料叫請求

伺服器給客戶端回傳資料叫響應

請求又分為 GET 請求,和 POST 請求兩種

Get請求格式(請求行+請求頭)

1.請求行

More Actions請求方式 Get
請求的資源路徑[+?+請求引數]
請求的協議的版本號 HTTP/1.1

2.請求頭

key : value 組成 不同的鍵值對,表示不同的

下面內容是Get請求的Http協議內容:

POST 請求格式(請求行+請求頭+空行+請求體)

1.請求行

More Actions請求方式 Post
請求的資源路徑[+?+請求引數]
請求的協議的版本號 HTTP/1.1

2.請求頭

  1. key : value 不同的請求頭,有不同的含義

3.空行

4.請求體

請求體 ===>>> 就是傳送給伺服器的

下面內容是Post請求的Http協議內容:

常用請求頭的說明

Accept: 表示客戶端可以接收的資料型別

Accpet-Languege: 表示客戶端可以接收的語言型別

User-Agent: 表示客戶端瀏覽器的資訊

Host: 表示請求時的伺服器 ip 和埠

判斷哪些是 GET 請求,哪些是 POST

GET 請求有哪些:

1、form 標籤 method=get 

2、a 標籤 

3、link 標籤引入 css 

4、Script 標籤引入 js 檔案 

5、img 標籤引入圖片 

6、iframe 引入 html 頁面

 7、在瀏覽器位址列中輸入地址後敲回車 

POST 請求有哪些:

8、form 標籤 method=pos

響應的 HTTP 協議格式

格式:響應行+響應頭+空行+響應體

1、響應

(1) 響應的協議和版本號

(2) 響應狀態碼

(3) 響應狀態描述符

2、響應頭

(1) key : value 不同的響應頭,有其不同含義

3.空行

4.響應體 ---->>> 就是回傳給客戶端的

常用的響應碼說明

200 表示請求成功

302 表示請求重定向

404 表示請求伺服器已經收到了,但是你要的資料不存在(請求地址錯誤)

500 表示伺服器已經收到請求,但是伺服器內部錯誤(程式碼錯誤)

MIME 型別說明

MIME 是 HTTP 協議中資料型別。 MIME 的英文全稱是"Multipurpose Internet Mail Extensions" 多功能 Internet 郵件擴充服務。MIME 型別的格式是“大型別/小 型別”,並與某一種檔案的副檔名相對應。

常見的 MIME 型別:

檔案 MIME 型別
超文字標記語言文字 .html , .htm text/html
普通文字 .txt text/plain
RTF 文字 .rtf application/rtf
GIF 圖形 .gif image/gif
JPEG 圖 .jpeg,.jpg image/jpeg
au 聲音文 .au audio/basic
MIDI 音樂檔案 mid,.midi audio/midi,audio/x-midi
RealAudio 音樂文 .ra, .ram audio/x-pn-realaudio
MPEG 文 .mpg,.mpeg video/mpeg
AVI 文 .avi video/x-msvideo
GZIP 文 .gz application/x-gzip
TAR 檔案 .tar application/x-tar

亂碼問題

doGet 請求的中文亂碼解決

// 獲取請求引數
String username = req.getParameter("username");
//1 先以 iso8859-1 進行編碼
//2 再以 utf-8 進行解碼
username = new String(username.getBytes("iso-8859-1"), "UTF-8");

POST 請求的中文亂碼解決

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// 設定請求體的字符集為 UTF-8,從而解決 post 請求的中文亂碼問題
req.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 獲取請求引數
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("使用者名稱:" + username);
System.out.println("密碼:" + password);
System.out.println("興趣愛好:" + Arrays.asList(hobby));
}

響應的亂碼解決

解決響應中文亂碼方案一(不推薦使用):

// 設定伺服器字符集為 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通過響應頭,設定瀏覽器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");

解決響應中文亂碼方案二(推薦):

// 它會同時設定伺服器和客戶端都使用 UTF-8 字符集,還設定了響應頭
// 此方法一定要在獲取流物件之前呼叫才有效
resp.setContentType("text/html; charset=UTF-8")

亂碼的統一解決最終方案自定義過濾器

核心程式碼:

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=utf-8");

public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8"); 
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}