Servlet HTTP 狀態碼


HTTP 請求和HTTP 回應訊息的格式是類似的,結構如下:

  • #初始狀態列+ 回車換行符(回車+換行)

  • 零個或多個標題行+回車換行符號

  • #一個空白行,即回車換行符號

  • #一個可選的訊息主體,例如檔案、查詢資料或查詢輸出

例如,伺服器的回應頭如下所示:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>

狀態列包括HTTP 版本(在本例中為HTTP/1.1)、一個狀態碼(在本例中為200)和一個對應於狀態碼的短訊息(在本例中為OK)。

以下是可能從 Web 伺服器傳回的 HTTP 狀態碼和相關的資訊清單:

##204#No Content  205Reset Content 206Partial Content 300Multiple Choices#連結清單。用戶可以選擇一個鏈接,進入到該位置。最多五個地址。 301Moved Permanently所要求的頁面已經轉移到一個新的 URL。 302Found所要求的頁面已經暫時轉移到一個新的 URL。 303See Other所要求的頁面可以在另一個不同的 URL 下被找到。 304Not Modified 305Use Proxy 306在先前的版本中使用程式碼。現在已不再使用它,但程式碼仍被保留。 307Temporary Redirect所要求的頁面已經暫時轉移到一個新的 URL。 400Bad Request伺服器不理解請求。 401Unauthorized#所要求的頁面需要使用者名稱和密碼。 402Payment Required403Forbidden禁止存取所要求的頁面。 404Not Found伺服器無法找到所要求的頁面。 .405Method Not Allowed在請求中指定的方法是不允許的。
程式碼訊息描述
#100Continue 只有請求的一部分已經被伺服器接收,但只要它沒有被拒絕,客戶端應繼續該請求。
101Switching Protocols伺服器切換協定。
200OK請求成功。
201Created該請求是完整的,並建立一個新的資源。
202Accepted該請求被接受處理,但是該處理是不完整的。
203Non-authoritative Information 
Unused
您還不能使用程式碼。
406Not Acceptable#伺服器只產生一個不被客戶端接受的回應。
407Proxy Authentication Required在請求送達之前,您必須使用代理伺服器的驗證。
408Request Timeout請求需要的時間比伺服器能夠等待的時間長,逾時。
409Conflict#請求因為衝突無法完成。
410Gone所要求的頁面不再可用。
411Length Required"Content-Length" 未定義。伺服器無法處理客戶端傳送的不含 Content-Length 的請求資訊。
412Precondition Failed請求中給出的先決條件被伺服器評估為 false。
413Request Entity Too Large伺服器不接受該請求,因為請求實體過大。
414Request-url Too Long伺服器不接受該請求,因為 URL 太長。當您轉換一個 "post" 請求為一個帶有長的查詢資訊的 "get" 請求時發生。
415Unsupported Media Type伺服器不接受該要求,因為媒體類型不支援。
417Expectation Failed
500Internal Server Error未完成的請求。伺服器遇到了一個意外的情況。
501Not Implemented#未完成的請求。伺服器不支援所需的功能。
502Bad Gateway#未完成的請求。伺服器從上游伺服器收到無效回應。
503Service Unavailable#未完成的請求。伺服器暫時超載或當機。
504Gateway Timeout網關逾時。
505HTTP Version Not Supported伺服器不支援"HTTP協定"版本。

設定 HTTP 狀態碼的方法

下面的方法可用來在 Servlet 程式中設定 HTTP 狀態碼。這些方法透過 HttpServletResponse 物件可用。

23
序號#方法& 說明
#1##public void setStatus ( int statusCode )該方法設定一個任意的狀態碼。 setStatus 方法接受一個 int(狀態碼)作為參數。如果您的反應包含了一個特殊的狀態碼和文檔,請確保在使用
PrintWriter 實際返回任何內容之前調用 setStatus。
public void sendRedirect(String url)該方法產生一個302 回應,連同一個帶有新文檔URL 的
Location 頭。
public void sendError(int code, String message)該方法發送一個狀態碼(通常為404),連同一個在HTML 文件內部自動格式化並傳送到客戶端的短訊息。

HTTP 狀態碼實例

下面的範例把407 個錯誤代碼傳送到客戶端瀏覽器,瀏覽器會顯示"Need authentication! !!" 訊息。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// 扩展 HttpServlet 类
public class showError extends HttpServlet {
 
  // 处理 GET 方法请求的方法
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置错误代码和原因
      response.sendError(407, "Need authentication!!!" );
  }
  // 处理 POST 方法请求的方法
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

現在,呼叫上面的Servlet 會顯示下列結果:

HTTP Status 407 - Need authentication!!!

type Status report

message Need authentication!!!

description# The client must first authenticate itself with the proxy (Need authentication!!!).

Apache Tomcat/5.5.29

################################################################