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

HTTP 回應狀態碼全解析與 Servlet 實戰應用

     編輯:Java 相關知識

HTTP 回應由狀態行、回應頭、空行、實體內容組成。狀態碼是伺服器告知客戶端請求處理結果的核心指標,Servlet 透過 HttpServletResponse 靈活控制狀態碼,實現重導向、錯誤處理、快取控制等關鍵功能。

狀態碼分類與核心含義

範圍類別典型代碼說明
1xx資訊回應100 Continue客戶端繼續發送請求主體
2xx成功200 OK、201 Created、204 No Content請求正常處理,204 適合快取刷新場景
3xx重導向301 Moved Permanently、302 Found、304 Not Modified301 永久移動,302 臨時重導,304 快取驗證
4xx客戶端錯誤400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found401 需認證,403 拒絕,404 資源不存在
5xx伺服器錯誤500 Internal Server Error、503 Service Unavailable500 程式異常,503 過載/維護可配合 Retry-After

注意:HTTP/1.1 新增代碼(如 307、405、411)需檢查客戶端協議版本(request.getProtocol())再使用,避免相容性問題。

Servlet 設定狀態碼的三種方式

  1. 通用方法:response.setStatus(int sc),搭配 HttpServletResponse.SC_* 常數(如 SC_NOT_FOUND)提升可讀性。
  2. 錯誤專用:response.sendError(int sc, String msg) 自動生成錯誤頁面(預設 404)。
  3. 重導向專用:response.sendRedirect(String url) 產生 302 並設定 Location 頭,自動處理相對路徑轉絕對路徑,並為不支援自動重導的舊瀏覽器生成提示頁面。

設定狀態碼必須在輸出內容前完成,否則拋出 IllegalStateException。

實戰範例:多搜尋引擎重導向服務

根據用戶選擇的搜尋引擎、關鍵字、每頁筆數,動態構建 URL 並重導向;無效引擎返回 404。

package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;

public class SearchEngines extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String searchString = URLEncoder.encode(request.getParameter("searchString"), "UTF-8");
        String numResults = request.getParameter("numResults");
        String searchEngine = request.getParameter("searchEngine");

        SearchSpec[] specs = SearchSpec.getCommonSpecs();
        for (SearchSpec spec : specs) {
            if (spec.getName().equals(searchEngine)) {
                String url = response.encodeURL(spec.makeURL(searchString, numResults));
                response.sendRedirect(url); // 302 重導向
                return;
            }
        }
        response.sendError(response.SC_NOT_FOUND, "No recognized search engine specified."); // 404
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException { doGet(request, response); }
}

// 搜尋引擎規格封裝類
class SearchSpec {
    private String name, baseURL, numResultsSuffix;
    private static SearchSpec[] commonSpecs = {
        new SearchSpec("google", "https://www.google.com/search?q=", "&num="),
        new SearchSpec("duckduckgo", "https://duckduckgo.com/html/?q=", "&kl=")
        // 可擴充更多引擎
    };
    public SearchSpec(String name, String baseURL, String numResultsSuffix) {
        this.name = name; this.baseURL = baseURL; this.numResultsSuffix = numResultsSuffix;
    }
    public String makeURL(String q, String num) { return baseURL + q + numResultsSuffix + num; }
    public String getName() { return name; }
    public static SearchSpec[] getCommonSpecs() { return commonSpecs; }
}

前端表單提交至該 Servlet,即可實現統一搜尋入口,展示 302 與 404 的實際應用場景。

開發者必知的狀態碼陷阱

  • 302 vs 307:HTTP/1.0 302 允許 POST 轉 GET,HTTP/1.1 引入 307 明確禁止方法變更,嚴格 REST API 應用 307。
  • 204 No Content:回應無實體,瀏覽器保持當前頁面,適合 AJAX 輪詢或「另存為」確認。
  • 401 必須配合 WWW-Authenticate:否則瀏覽器不會彈出認證對話框。
  • 自定義錯誤頁:在 web.xml 配置 <error-page> 映射狀態碼至友好頁面,提升用戶體驗。

熟練運用狀態碼,是構建健壯、語義清晰 Web 服務的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved