【问题标题】:AsyncContext in Servlet 3.0 infinite browser loadingServlet 3.0 中的 AsyncContext 无限浏览器加载
【发布时间】:2012-05-08 04:22:43
【问题描述】:

我要制作流媒体。我有 .jsp 文件,在 .jsp 文件的末尾,我使用以下代码包含了我的 Async Servlet:

<jsp:include page = '/simple' flush = 'true' />

所以我希望在加载整个页面时打开一个无限的异步请求,该请求将处理异步响应。

这是我的 Servlet 代码:

public class SimpleAsyncServlet extends HttpServlet {
    public static AsyncContext ctx;
    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
        ctx = req.startAsync();
        ctx.setTimeout(0);
    }
}

从其他 java 类中,我使用静态 SimpleAsyncServlet.ctx.getResponse.getWriter() 将一些 javascript 代码打印到当前页面。它可以正常工作,但浏览器一直显示它正在加载。根据异步想法页面应该被加载并且这个异步请求应该在后台保持活动并且......就是这样,但是没有......浏览器一直加载页面直到永远(超时为0,因为我想要无限打开请求)

我哪里错了,如何在不加载此浏览器的情况下发出此永久请求?

附:我试图直接从 url (localhost.../simple) 访问我的 servlet,然后我看到页面上没有打印任何内容。它会一直加载到永远。

【问题讨论】:

  • 我已经纠正了。它是flush ='true'。我有:@javax.servlet.annotation.WebServlet( // servlet name name = "simple", // servlet url pattern value = {"/simple"}, // 需要异步支持 asyncSupported = true);而且我也试过 req.startAsync(req, res);没有任何帮助。

标签: java html servlets


【解决方案1】:

你正在努力实现不可能。

浏览器将显示页面正在加载,直到它通过以下方法之一知道它已收到完整请求:

  • 它已收到 Content-Length 标头中规定的字节数
  • 连接已关闭
  • 在使用分块编码时收到一个结束块

由于您想要“无限”响应,因此上述三个选项都不会发生。

【讨论】:

  • 那我怎么做流媒体?或者我怎样才能实现“推送”到浏览器?据我了解,“推送”只是无限的开放请求还是我错了?
  • 如果我从 .js 发出 Ajax 请求,据我所知,我没有看到浏览器加载
  • HTTP 是一个请求/响应协议。您无法实现真正​​的推送。有多种方法可以破解看起来像使用 HTTP 推送的东西。如果你想要一个真正的服务器推送,那么你需要像 WebSocket 这样的东西。您可以使用或不使用 Servlet 3.0 Async 从 Servlet 流式传输内容。如果浏览器将结果显示为网页,那么它总是看起来像是正在加载页面。为避免这种情况,您需要在页面中嵌入一些东西(选择您选择的技术)来执行请求并处理响应,这样浏览器就不会意识到发生了什么。
  • 非常感谢,但是你能推荐我一些技术吗?其实我要去聊天了。
  • 我使用 Ajax 来 servlet 和线程来控制聊天,而不是 Java 异步。现在可以了,谢谢你的建议。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 2014-08-17
  • 2013-12-11
  • 2020-09-27
相关资源
最近更新 更多