如何response.setHeader工作?

时间:2011-09-09 17:35:45

标签: java servlets

我在java中有一个过滤器,用于检测生成时间是否超过200,然后将缓存控制头设置为特定时间。

这是为了避免服务器速度变慢,自动平衡其负载。

我对此表示怀疑:

在任何情况下,serlvet包含器在写入一些响应头之前是否使用了更多内存?

当我执行resp.write()时,servlet容器(tomcat或其他)是否可以将数据写入连接?

我担心内存问题。我认为它可能会使用额外的内存来生成所有响应,没有缓冲区,直到响应完成,然后servlet容器开始写入。

3 个答案:

答案 0 :(得分:0)

这取决于您的应用程序容器,这绝对100%不会对内存使用产生重大影响。如果写入响应中的缓冲区大小是任何问题,Java可能不适合您。

硬件放弃平台。如果你有内存使用问题,你可能会找错了地方。

答案 1 :(得分:0)

误解:我认为有一个线程在等待200毫秒,然后在没有发生时写入标题。不是这种情况(要在响应生成的 end 处写入标题)。下面的问题会出现在这种情况下,但我会再次尝试回答你真正想要的内容。


我不相信servlet中的“响应”意味着是线程安全的 - 你不应该尝试将数据写入补充线程中的响应变量(如果我理解“等待200毫秒”逻辑)而主要请求处理程序线程正在为请求提供服务。

除了在过滤器写入“标题”之前刷新部分响应的问题之外,数据可能只是丢失或乱码而不是识别(不仅仅是不按顺序)。

但是,您可以让过滤器为响应提供包装器。使包装类线程安全,并使其缓冲输出。 然后,您可以在200毫秒后检查(以同步的原子方式)以查看响应缓冲区中是否有任何内容,如果没有则标记标题。

答案 2 :(得分:0)

您可能最好将动态代理/调用处理程序对配置为响应实现的包装,而不是将缓冲区大小配置为希望为“无穷大”的内容。

请参阅http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-proxy.html

您的过滤器会创建调用处理程序并将其放入动态代理中,您可以将其传递到链中的后续过滤器/ servlet中,而不是真正的响应实现。

当链中更深层次的东西返回时,如果需要,您可以生成标题,并从代理中获取缓冲数据,以便您可以在标题之后写入正文。

是的,它使用内存。不能说我会担心太多。如果您的应用程序返回一个20 MB的“页面”,您可能希望将其作为一个问题来解决。 (分页等)