首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Web 學習總結(四):HTTP 協議核心詳解——請求/響應結構、狀態碼、消息頭與 Servlet 實戰控制瀏覽器行為

     編輯:Java 綜合教學

Java Web 學習總結(四):HTTP 協議核心詳解——請求/響應結構、狀態碼、消息頭與 Servlet 實戰控制瀏覽器行為

HTTP 是 Web 開發的基石。本文系統梳理 HTTP/1.0 與 1.1 差異、請求/響應報文結構、常用消息頭、狀態碼分類,並給出 Servlet 控制瀏覽器行為(重定向、壓縮、Content-Type、定時刷新、文件下載)的完整代碼示例。

一、HTTP 協議基礎

二、HTTP 請求報文結構

請求行:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
消息頭:
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 ...
Host: localhost:8080
Connection: Keep-Alive
Referer: https://localhost:8080/prev.jsp
空行
實體內容(POST 才有):username=admin&pwd=123

請求方式對比

項目說明
全稱HyperText Transfer Protocol(超文本傳輸協議)
層級TCP/IP 應用層協議
作用定義瀏覽器與 Web 服務器交換數據的格式與流程
版本HTTP/1.0(短連接,每請求一個資源)、HTTP/1.1(長連接,管道化、持久連接)

常用請求頭

特性GETPOST
數據位置URL 參數(?key=val&...)請求體
數據大小限制~1KB(瀏覽器/服務器限制)無限制(受 postMaxSize 配置)
安全性明文顯示在 URL/歷史/日志相對隱蔽(仍明文傳輸,需 HTTPS)
幂等性是否(除非業務設計為幂等)
緩存可被緩存默認不緩存

三、HTTP 響應報文結構

狀態行:HTTP/1.1 200 OK
消息頭:
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 105
Date: Tue, 27 May 2014 16:23:28 GMT
空行
實體內容:
Hello World JSPHello World!

狀態碼分類

頭部含義
Accept客戶端支持的媒體類型
Accept-Charset支持的字符集
Accept-Encoding支持的壓縮格式(gzip, deflate)
Accept-Language語言偏好
Host目標主機(虛擬主機必需)
If-Modified-Since緩存驗證時間戳
Referer來源頁面(防盜鏈、統計)
ConnectionKeep-Alive / close
User-Agent客戶端標識

常用響應頭

類別範圍含義典型
1xx100-199信息性100 Continue
2xx200-299成功200 OK, 201 Created, 204 No Content
3xx300-399重定向301 永久, 302 臨時, 304 Not Modified
4xx400-499客戶端錯誤400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx500-599服務端錯誤500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

四、Servlet 實戰:設置響應頭控制瀏覽器行為

1. 重定向 (302 + Location)


response.setStatus(302);
response.setHeader("Location", "/JavaWeb_HttpProtocol_Study/1.jsp");
// 或簡寫:response.sendRedirect("/JavaWeb_HttpProtocol_Study/1.jsp");

2. GZIP 壓縮響應 (Content-Encoding)


String data = "abcd...".repeat(100); // 大文本
ByteArrayOutputStream bout = new ByteArrayOutputStream();
try (GZIPOutputStream gout = new GZIPOutputStream(bout)) {
    gout.write(data.getBytes(StandardCharsets.UTF_8));
}
byte[] gzipped = bout.toByteArray();

response.setHeader("Content-Encoding", "gzip");
response.setHeader("Content-Length", String.valueOf(gzipped.length));
response.getOutputStream().write(gzipped);

3. 指定響應類型 (Content-Type) - 輸出圖片


response.setContentType("image/jpeg"); // 等同 setHeader("Content-Type", "image/jpeg")
try (InputStream in = getServletContext().getResourceAsStream("/img/WP_20131005_002.jpg");
     OutputStream out = response.getOutputStream()) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) > 0) out.write(buffer, 0, len);
}

4. 定時刷新/跳轉 (Refresh)


// 每 3 秒刷新當前頁
response.setHeader("Refresh", "3");
// 3 秒後跳轉到百度
response.setHeader("Refresh", "3;url='https://www.baidu.com'");
response.getWriter().write("即將跳轉...");

5. 文件下載 (Content-Disposition)


response.setHeader("Content-Disposition", "attachment;filename=xxx.jpg");
try (InputStream in = getServletContext().getResourceAsStream("/img/1.jpg");
     OutputStream out = response.getOutputStream()) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) > 0) out.write(buffer, 0, len);
}

五、最佳實踐提醒

  1. 編碼設置:response.setCharacterEncoding("UTF-8") 必須在 getWriter() 前調用,或用 setContentType("text/html;charset=UTF-8") 一次性搞定。
  2. 流關閉:使用 try-with-resources 確保 InputStream/OutputStream 關閉,防止句柄洩漏。
  3. 大文件下載:設置 Content-Length 支持斷點續傳;超大文件考慮 RandomAccessFile + Range 請求頭實現分片下載。
  4. 安全頭:生產環境添加 X-Frame-Options: DENY、X-Content-Type-Options: nosniff、Strict-Transport-Security 等安全響應頭。
  5. 緩存策略:靜態資源設置長期緩存 Cache-Control: max-age=31536000,動態頁面 Cache-Control: no-store。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
頭部作用典型值
Location重定向目標 URL/login.jsp
Server服務器標識Apache-Coyote/1.1
Content-Encoding響應體壓縮格式gzip
Content-Length響應體字節長度1024
Content-Type響應體媒體類型text/html;charset=UTF-8
Refresh定時刷新/跳轉3;url=https://baidu.com
Content-Disposition下載文件名attachment;filename=test.jpg
Expires / Cache-Control / Pragma緩存控制-1 / no-cache / no-cache