Java-HttpServlet : When is the response sent to the client?

标签 java httpresponse

我几乎没有尝试过一些 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 毫秒后生成的响应。由于 sleep ,我认为我需要超过 1500 毫秒。我的理解是基于这篇文章:Link

最佳答案

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

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

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

(请原谅我的英语不好)

关于Java-HttpServlet : When is the response sent to the client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22728916/

相关文章:

java - 在Java中,如何删除Sqlite表

java - 计算正确的文本宽度

java - 无法为 JBoss 安装或部署 h2-console

iphone - 单个请求到多个异步响应

javascript - 在 Nodejs 中读取原始 http 消息

java - 在java客户端中从http响应中提取字符串

java - XML 不使用转义字符进行解析

java - react native : Volume Button Should Only Control Media (Android)

java - 如何为我的模拟实例化 unirest HttpResponse<JsonNode> ?

c# - ASP.NET JavaScriptSerializer 需要 HttpResponse?