Java HttpServletResponse在更改另一个标头时发出宽度Content-Length

时间:2013-09-29 12:15:10

标签: java java-ee servlets http-headers httpresponse

问题汇总:将HttpServletResponse中的“Content-type”标题更改为“image / svg + xml”会给我一个空响应,“Content-length”在我的浏览器中显示为“0”。

完整说明:

我正在使用使用HttpServletRequest和HttpServletResponse的CMS插件(使用Java)。 CMS对.svg文件的请求返回“application / octet-stream”时出现问题。

我正在处理的插件是一个Servlet,它拦截所有请求 - 响应对(将特定的URL模式与图像文件夹相匹配)。 然后我检查请求字符串是否包含“.svg”,然后在响应中将Content-Type更改为“image / svg + xml”(来自“application / octet-stream”)。

但是当我改变内容类型时; Content-length标头为0,浏览器不显示任何内容。换句话说,在更改标题后我丢失了内容。

是否有某些方法可以只更改一个标头而无需将图像内容写回到响应中? (ServletOutputStream的)。

我提出了一个解决方案;在将其写入相关svg图像之前执行额外的HttpGet请求(在插件中),然后将其写入来自InputStream的响应中,但我认为这对于流量服务器上的每个svg请求来说成本太高。

如果我只能更改标题,而不执行额外的I / O操作。

1 个答案:

答案 0 :(得分:0)

如果你的插件是Filter而不是Servlet(也许你的框架允许过滤插件?)那么你可以在响应处理之前将响应对象包装在HttpServletResponseWraper中,并且包装器可以将内容保存到内存中的某些流,而不是将其写入响应流。然后,当处理结束时,您将设置标头,获取写入内存的内容并将其提交给响应。

第二个想法:您甚至不必在框架级别定义此过滤器。如果您可以访问并可以自由修改应用程序的web.xml,那么您可以使用普通的旧Java EE过滤器轻松实现它。

无论如何,我不明白为什么设置内容类型会重置内容。 ServletResponse.setContentType的文档没有说明任何内容。