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.請求頭
- 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() {
}
}