Servlet - HTTP 状态码



HTTP 请求和 HTTP 响应消息的格式相似,都具有以下结构:

  • 初始状态行 + CRLF(回车 + 换行)

  • 零个或多个报头行 + CRLF

  • 空行,即 CRLF

  • 可选的消息正文,例如文件、查询数据或查询输出。

例如,服务器响应报头如下所示:

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 状态码和相关消息列表:

代码 消息 描述
100 继续 (Continue) 服务器只收到部分请求,但只要未被拒绝,客户端应继续请求。
101 切换协议 (Switching Protocols) 服务器切换协议。
200 确定 (OK) 请求成功。
201 已创建 (Created) 请求已完成,并创建了新的资源。
202 已接受 (Accepted) 请求已被接受以进行处理,但处理尚未完成。
203 非权威信息 (Non-authoritative Information)  
204 无内容 (No Content)  
205 重置内容 (Reset Content)  
206 部分内容 (Partial Content)  
300 多种选择 (Multiple Choices) 链接列表。用户可以选择一个链接并转到该位置。最多五个地址。
301 永久移动 (Moved Permanently) 请求的页面已移动到新的 URL。
302 已找到 (Found) 请求的页面已暂时移动到新的 URL。
303 查看其他 (See Other) 请求的页面可以在不同的 URL 下找到。
304 未修改 (Not Modified)  
305 使用代理 (Use Proxy)  
306 未使用 (Unused) 此代码在以前的版本中使用过。它不再使用,但代码已被保留。
307 临时重定向 (Temporary Redirect) 请求的页面已暂时移动到新的 URL。
400 错误请求 (Bad Request) 服务器不理解请求。
401 未授权 (Unauthorized) 请求的页面需要用户名和密码。
402 需要付款 (Payment Required) 您尚不能使用此代码。
403 禁止 (Forbidden) 禁止访问请求的页面。
404 未找到 (Not Found) 服务器找不到请求的页面。
405 不允许使用方法 (Method Not Allowed) 请求中指定的方法不允许。
406 不可接受 (Not Acceptable) 服务器只能生成客户端不接受的响应。
407 需要代理身份验证 (Proxy Authentication Required) 在提供此请求之前,您必须通过代理服务器进行身份验证。
408 请求超时 (Request Timeout) 请求时间超过服务器准备等待的时间。
409 冲突 (Conflict) 由于冲突,无法完成请求。
410 已消失 (Gone) 请求的页面不再可用。
411 需要长度 (Length Required) 未定义“Content-Length”。服务器不会在没有它的情况下接受请求。
412 前提条件失败 (Precondition Failed) 服务器评估请求中给定的前提条件为假。
413 请求实体过大 (Request Entity Too Large) 服务器将不接受请求,因为请求实体过大。
414 请求 URL 过长 (Request-url Too Long) 服务器将不接受请求,因为 URL 过长。当您将“post”请求转换为具有较长查询信息的“get”请求时发生。
415 不支持的媒体类型 (Unsupported Media Type) 服务器将不接受请求,因为不支持媒体类型。
417 期望失败 (Expectation Failed)  
500 内部服务器错误 (Internal Server Error) 请求未完成。服务器遇到意外情况。
501 未实现 (Not Implemented) 请求未完成。服务器不支持所需的功能。
502 错误网关 (Bad Gateway) 请求未完成。服务器从上游服务器收到无效响应。
503 服务不可用 (Service Unavailable) 请求未完成。服务器暂时过载或宕机。
504 网关超时 (Gateway Timeout) 网关超时。
505 不支持的 HTTP 版本 (HTTP Version Not Supported) 服务器不支持“http 协议”版本。

设置 HTTP 状态码的方法

以下方法可用于在 Servlet 程序中设置 HTTP 状态码。这些方法可用于`HttpServletResponse`对象。

序号 方法及描述
1

public void setStatus(int statusCode)

此方法设置任意状态码。setStatus 方法将 int(状态码)作为参数。如果您的响应包含特殊状态码和文档,请确保在使用`PrintWriter`实际返回任何内容之前调用 setStatus。

2

public void sendRedirect(String url)

此方法生成 302 响应以及包含新文档 URL 的`Location`标头。

3

public void sendError(int code, String message)

此方法发送状态码(通常为 404)以及简短消息,该消息会自动格式化为 HTML 文档并发送给客户端。

HTTP 状态码示例

以下示例将向客户端浏览器发送 407 错误代码,浏览器将显示“需要身份验证!”消息。

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class showError extends HttpServlet {
 
   // Method to handle GET method request.
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      // Set error code and reason.
      response.sendError(407, "Need authentication!!!" );
   }
   
   // Method to handle POST method request.
   public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      
      doGet(request, response);
   }
}

现在调用上述 Servlet 将显示以下结果:

HTTP Status 407 - Need authentication!!!

type Status report

messageNeed authentication!!!

descriptionThe client must first authenticate itself with the proxy (Need authentication!!!).

Apache Tomcat/5.5.29

广告