【问题标题】:Java - HttpServlet: When is the response sent to the client?Java - HttpServlet:响应何时发送到客户端?
【发布时间】:2014-03-29 08:44:12
【问题描述】:

我很少尝试一些 HttpServlet 的东西来更好地理解它。我想构建一个请求传入的场景,我需要尽可能快地相应地发送响应,然后在 servlet 中做更多的工作。根据我目前的理解,只有在 doGet 或 doPost 方法返回时才应将响应发送给客户端。但从我的示例中,响应已经在 servlet 中的命令处理过程中发送回客户端。所以它已经在我没想到的时候被退回了。

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
        }

        response.setContentType("text/plain; charset=ISO-8859-1");
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        final StringWriter sw = new StringWriter();
        PrintWriter out = new PrintWriter(sw);
        //TODO most be implemented SynchronizedStatusCodeDimo
        out.println("StatusCode=0");
        out.println("StatusText=Accepted");
        out.println("paymentType=PaymentXY");
        out = response.getWriter();
        out.print(sw.toString());
        out.flush();
        out.close();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
        } }

这里发生了什么,通过 Firebug 我看到我已经收到了 510 毫秒后生成的响应。由于睡眠,我认为我需要超过 1500 毫秒。我的理解是基于这里的这篇文章:Link

【问题讨论】:

  • 这里有什么问题?那个 flush() 刷新?或者 close() 关闭?为什么会有这么大的惊喜?
  • 我们能否在 request1 成功回调后不从客户端响应 request2。并且请求 2 可以根据 request1 的响应做进一步的处理..
  • 是的,也许根本没有问题,我一开始只是错了,并期待在 Servlet 中完成所有操作后得到响应(所以当 doGet/doPost 返回时),不像正在处理中。

标签: java httpresponse


【解决方案1】:

HttpServletResponse 将由您的 servlet 容器(Tomcat、Jetty 等)控制。

如果您写入response,servlet 容器会在定义的缓冲区大小(例如 9000 字节后的 Tomcat)后自动刷新response。通常你可以配置它(在 Tomcat 中使用参数socketBuffer)。 如果你不自己控制它,它就是这样工作的。

在您的情况下,您可以自己控制响应,在您致电response.flush() 后,响应将发送给客户端。 如果你写了更多的 9000 字节(在 Tomcat 中),响应将自动发送(在这一切的中间)。

(请原谅我的英语不好)

【讨论】:

  • 谢谢。但是 out.close() 在我的示例中强制发送响应。当我删除 out.close() 行并且只有 out.flush() 时,响应会在 1500 毫秒后发送,因此在发送响应之前会处理两个睡眠。
  • 这是不正确的。在您的第一种情况下,答案在大约 500 毫秒后开始(在 out.flush() 之后)并且它也在 500 毫秒后完成,因为您关闭了流。在第二秒,服务器在 500 毫秒后开始响应(在 out.flush() 之后),但响应在 1500 毫秒后结束,因为 servlet 容器在这一切之后关闭了流。你应该在萤火虫中看到这个
  • 我明白了,现在完全有道理了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2017-08-11
  • 1970-01-01
  • 2013-04-27
  • 2018-10-12
  • 2016-01-20
  • 2013-09-14
相关资源
最近更新 更多