Servlets 在Tomcat6中为comet servlet禁用输出缓冲
我使用comet和Tomcat6将数据推送到客户端 我希望在连接关闭之前接收数据(XMLHttpRequest的就绪状态=3),问题是Tomcat6在发送数据之前会缓冲数据,所以我需要做一些棘手的事情来实现这一点 我已经将请求内容类型设置为application/x-javascript,将req内容类型设置为application/xml(以便禁用浏览器缓存) 我在tomcat 6中使用了许多可用选项来禁用缓存(nio连接器中的socketBuffer=-1,等等),这在我的本地tomcat 6(在windows操作系统上)中有效(实际上,即使没有修改任何默认选项) 但是,对于配置相同的tomcat 6的事件,当我在提供的tomcat 6服务器上部署应用程序时,服务器输出缓冲区很大,我必须发送空字节以触发输出写入程序刷新(参见下面的代码) byte[]bytes=新字节[event.getHttpServletResponse().getBufferSize()-new Gson().toJson(messagesContent.getBytes().length]; event.getHttpServletResponse(); event.getHttpServletResponse().getOutputStream().write(字节); event.getHttpServletResponse().getOutputStream().flush() 如果我不在数据内容之外写入字节,则数据不会发送到客户端。这真的很烦人,因为我发送无用的空字节,而且因为我必须在客户端管理这些空字节。太可怕了 有人有解决办法吗?如何禁用comet servlet输出缓冲区。对于我来说,默认情况下应该为comet servlet禁用输出缓冲区是非常明显的。听起来很奇怪 提前谢谢你Servlets 在Tomcat6中为comet servlet禁用输出缓冲,servlets,buffer,tomcat6,comet,Servlets,Buffer,Tomcat6,Comet,我使用comet和Tomcat6将数据推送到客户端 我希望在连接关闭之前接收数据(XMLHttpRequest的就绪状态=3),问题是Tomcat6在发送数据之前会缓冲数据,所以我需要做一些棘手的事情来实现这一点 我已经将请求内容类型设置为application/x-javascript,将req内容类型设置为application/xml(以便禁用浏览器缓存) 我在tomcat 6中使用了许多可用选项来禁用缓存(nio连接器中的socketBuffer=-1,等等),这在我的本地tomcat
你试过使用过滤器吗? 在定制请求和响应的编程中 使用decorator模式可以控制输出。 实现这一点的方法是将生成响应的servlet传递给代理流。代理流防止servlet在完成时关闭原始响应流
class CharResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
public String toString() {
return output.toString();
}
public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}
public PrintWriter getWriter(){
return new PrintWriter(output);
}
}
因此,在过滤器的doFilter方法中,您将获得原始的PrintWriter,并传递包装器
PrintWriter out = response.getWriter();
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapper);
然后Servlet将在charrayraywriter中写入所有输出,这样您就可以在没有缓冲的情况下以字符串的形式获得输出
wrapper.toString()
然后您可以修改、追加。。etc,然后使用原始响应输出写入内容
out.write(wrapper.toString());
out.close();