Servlet 服务器 HTTP 响应
当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。
一个响应模板如下所示:
状态行
HTTP/1.1 200 OK
一些响应报头
Content-Length:156
Content-Type:text/html;charset=ISO-8859-1
Date:Wed, 06 Dec 2017 06:18:49 GMT
Server:Apache-Coyote/1.1
空行
Header2: ...
...
文档
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
状态行包括 HTTP 版本(HTTP/1.1)、一个状态码(200)和一个对应于状态码的短消息( OK)。
Servlet 服务器 HTTP 响应头信息:
头信息 | 描述 |
---|---|
Allow | 这个头信息指定服务器支持的请求方法(GET、POST 等)。 |
Cache-Control | 这个头信息指定响应文档在何种情况下可以安全地缓存。可能的值有:public、private 或 no-cache 等。Public 意味着文档是可缓存,Private 意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache 意味着文档不应被缓存。 |
Connection | 这个头信息指示浏览器是否使用持久 HTTP 连接。值 close 指示浏览器不使用持久 HTTP 连接,值 keep-alive 意味着使用持久连接。 |
Content-Disposition | 这个头信息可以让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘。 |
Content-Encoding | 在传输过程中,这个头信息指定页面的编码方式。 |
Content-Language | 这个头信息表示文档编写所使用的语言。例如,en、en-us、ru 等。 |
Content-Length | 这个头信息指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要这些信息。 |
Content-Type | 这个头信息提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型。 |
Expires | 这个头信息指定内容过期的时间,在这之后内容不再被缓存。 |
Last-Modified | 这个头信息指示文档的最后修改时间。然后,客户端可以缓存文件,并在以后的请求中通过 If-Modified-Since请求头信息提供一个日期。 |
Location | 这个头信息应被包含在所有的带有状态码的响应中。在 300s 内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。 |
Refresh | 这个头信息指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。 |
Retry-After | 这个头信息可以与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求。 |
Set-Cookie | 这个头信息指定一个与页面关联的 cookie。 |
设置 HTTP 头部信息的方法:
方法 | 描述 |
---|---|
String encodeRedirectURL(String url) | 为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。 |
String encodeURL(String url) | 对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。 |
boolean containsHeader(String name) | 返回一个布尔值,指示是否已经设置已命名的响应报头。 |
boolean isCommitted() | 返回一个布尔值,指示响应是否已经提交。 |
void addCookie(Cookie cookie) | 把指定的 cookie 添加到响应。 |
void addDateHeader(String name, long date) | 添加一个带有给定的名称和日期值的响应报头。 |
void addHeader(String name, String value) | 添加一个带有给定的名称和值的响应报头。 |
void addIntHeader(String name, int value) | 添加一个带有给定的名称和整数值的响应报头。 |
void flushBuffer() | 强制任何在缓冲区中的内容被写入到客户端。 |
void reset() | 清除缓冲区中存在的任何数据,包括状态码和头。 |
void resetBuffer() | 清除响应中基础缓冲区的内容,不清除状态码和头。 |
void sendError(int sc) | 使用指定的状态码发送错误响应到客户端,并清除缓冲区。 |
void sendError(int sc, String msg) | 使用指定的状态发送错误响应到客户端。 |
void sendRedirect(String location) | 使用指定的重定向位置 URL 发送临时重定向响应到客户端。 |
void setBufferSize(int size) | 为响应主体设置首选的缓冲区大小。 |
void setCharacterEncoding(String charset) | 设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。 |
void setContentLength(int len) | 设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。 |
void setContentType(String type) | 如果响应还未被提交,设置被发送到客户端的响应的内容类型。 |
void setDateHeader(String name, long date) | 设置一个带有给定的名称和日期值的响应报头。 |
void setHeader(String name, String value) | 设置一个带有给定的名称和值的响应报头。 |
void setIntHeader(String name, int value) | 设置一个带有给定的名称和整数值的响应报头。 |
void setLocale(Locale loc)如果响应还未被提交,设置响应的区域。 | |
void setStatus(int sc) | 为该响应设置状态码。 |
HTTP Header设置请求头信息Demo:
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class ServletDemo extends javax.servlet.http.HttpServlet {
public ServletDemo() {
System.out.println("实例化servlet");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用servlet");
// 设置刷新自动加载时间为 5 秒
resp.setIntHeader("Refresh", 5);
// 设置响应内容类型
resp.setContentType("text/html");
//获取当前时间
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
//设置字符编码
resp.setCharacterEncoding("UTF-8");
PrintWriter pw=resp.getWriter();
pw.println("<html>\n" +
" <head>\n" +
" <title>"+"调用servlet"+"</title>\n" +
" </head>\n" +
" <body>\n" +
" <h1>\n"+
" 当前时间:"+CT+
" </h1>\n" +
" </body>\n" +
"</html>");
}
}
现在,调用上面的 Servlet,每隔 5 秒会自动刷新显示当前系统时间:
当前时间:3:37:7 PM
Servlet 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” 未定义。服务器无法处理客户端发送的不带 Content-Length 的请求信息。 |
412 | Precondition Failed | 请求中给出的先决条件被服务器评估为 false。 |
413 | Request Entity Too Large | 服务器不接受该请求,因为请求实体过大。 |
414 | 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 Version Not Supported | 服务器不支持”HTTP协议”版本。 |
设置 HTTP 状态代码的方法
方法 | 描述 |
---|---|
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 状态码实例
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Top on 2017/12/5.
*/
public class ServletDemo extends javax.servlet.http.HttpServlet {
public ServletDemo() {
System.out.println("实例化servlet");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用servlet");
// 设置刷新自动加载时间为 5 秒
resp.sendError(410, "Never Use!!!" );
}
现在,调用上面的 Servlet 将显示以下结果: