服务器 HTTP 响应

服务器 HTTP 响应

正如在前面的章节中讨论的一样,当一个 Web 服务器对浏览器响应一个 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 1.1 响应头信息的总结,且在 web 编程中你会频繁地使用它们

头信息 描述
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 这个头信息应被包含在所有的带有状态码的响应中。在 300 s 内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档。
Refresh 这个头信息指定浏览器应该如何尽快请求更新的页面。您可以指定页面刷新的秒数。
Retry-After 这个头信息可以与 503(服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求。
Set-Cookie 这个头信息指定一个与页面关联的 cookie。
序号 方法 & 描述
1 String encodeRedirectURL(String url) 为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2 String encodeURL(String url) 对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
3 boolean containsHeader(String name) 返回一个布尔值,指示是否已经设置已命名的响应头信息。
4 boolean isCommitted() 返回一个布尔值,指示响应是否已经提交。
5 void addCookie(Cookie cookie) 把指定的 cookie 添加到响应。
6 void addDateHeader(String name, long date) 添加一个带有给定的名称和日期值的响应头信息。
7 void addHeader(String name, String value) 添加一个带有给定的名称和值的响应头信息。
8 void addIntHeader(String name, int value) 添加一个带有给定的名称和整数值的响应头信息。
9 void flushBuffer() 强制任何在缓冲区中的内容被写入到客户端。
10 void reset() 清除缓冲区中存在的任何数据,包括状态码和头信息。
11 void resetBuffer() 清除响应中基础缓冲区的内容,不清除状态码和头信息。
12 void sendError(int sc) 使用指定的状态码发送错误响应到客户端,并清除缓冲区。
13 void sendError(int sc, String msg) 使用指定的状态发送错误响应到客户端。
14 void sendRedirect(String location) 使用指定的重定向位置 URL 发送临时重定向响应到客户端。
15 void setBufferSize(int size) 为响应主体设置首选的缓冲区大小。
16 void setCharacterEncoding(String charset) 设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
17 void setContentLength(int len) 设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头信息。
18 void setContentType(String type) 如果响应还未被提交,设置被发送到客户端的响应的内容类型。
19 void setDateHeader(String name, long date) 设置一个带有给定的名称和日期值的响应头信息。
20 void setHeader(String name, String value) 设置一个带有给定的名称和值的响应头信息。
21 void setIntHeader(String name, int value) 设置一个带有给定的名称和整数值的响应头信息。
22 void setLocale(Locale loc) 如果响应还未被提交,设置响应的区域。
23 void setStatus(int sc) 为该响应设置状态码。

设置 HTTP 响应头信息的方法
下面的方法可用于在 servlet 程序中设置 HTTP 响应头信息。通过 HttpServletResponse 对象这些方法是可用的。

序号 方法 & 描述
1 String encodeRedirectURL(String url) 为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2 String encodeURL(String url) 对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
3 boolean containsHeader(String name) 返回一个布尔值,指示是否已经设置已命名的响应头信息。
4 boolean isCommitted() 返回一个布尔值,指示响应是否已经提交。
5 void addCookie(Cookie cookie) 把指定的 cookie 添加到响应。
6 void addDateHeader(String name, long date) 添加一个带有给定的名称和日期值的响应头信息。
7 void addHeader(String name, String value) 添加一个带有给定的名称和值的响应头信息。
8 void addIntHeader(String name, int value) 添加一个带有给定的名称和整数值的响应头信息。
9 void flushBuffer() 强制任何在缓冲区中的内容被写入到客户端。
10 void reset() 清除缓冲区中存在的任何数据,包括状态码和头信息。
11 void resetBuffer() 清除响应中基础缓冲区的内容,不清除状态码和头信息。
12 void sendError(int sc) 使用指定的状态码发送错误响应到客户端,并清除缓冲区。
13 void sendError(int sc, String msg) 使用指定的状态发送错误响应到客户端。
14 void sendRedirect(String location) 使用指定的重定向位置 URL 发送临时重定向响应到客户端。
15 void setBufferSize(int size) 为响应主体设置首选的缓冲区大小。
16 void setCharacterEncoding(String charset) 设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
17 void setContentLength(int len) 设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头信息。
18 void setContentType(String type) 如果响应还未被提交,设置被发送到客户端的响应的内容类型。
19 void setDateHeader(String name, long date) 设置一个带有给定的名称和日期值的响应头信息。
20 void setHeader(String name, String value) 设置一个带有给定的名称和值的响应头信息。
21 void setIntHeader(String name, int value) 设置一个带有给定的名称和整数值的响应头信息。
22 void setLocale(Locale loc) 如果响应还未被提交,设置响应的区域。
23 void setStatus(int sc) 为该响应设置状态码。

HTTP 头信息响应实例
在前面的实例中你已经了解了 setContentType() 方法的工作方式,下面的实例也会用到同样的方法,此外,我们会用 setIntHeader() 方法来设置 Refresh 头信息。
测试代码如下:

package servletStudent;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class setHead extends HttpServlet {

    
    public setHead() {
        super();
    }

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setIntHeader("Refresh", 5); 
          // Get current time
          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;    
          PrintWriter out = response.getWriter();
          out.println(CT);
          response.setIntHeader("cookie", arg1);
    }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            response.setContentType("text/html");
            response.setIntHeader("Refresh", 5); 
              // Get current time
              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;    
              PrintWriter out = response.getWriter();
              out.println(CT);
        
    }

}

运行结果如下:

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,793评论 19 139
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 12,702评论 6 152
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 10,617评论 3 82
  • 本文依照 知识共享许可协议(署名-非商业性使用-禁止演绎) 发布。 编写HTTP 服务器与客户端 Vert.x让编...
    半枚荔枝阅读 9,394评论 0 5
  • 一是否具有投资价值? 二投资规模以及现金流。 三关于买铺的头脑风暴。 1. 之所以拿出买铺这个议题来讨论,并不是...
    取个昵称都好难阅读 1,157评论 0 0