0

问题总结:将 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,浏览器不显示任何内容。换句话说,我在更改标题后丢失了内容。

有什么方法可以让我只更改一个标题而不必将图像内容写回响应?(Servlet 输出流)。

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

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

4

1 回答 1

0

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

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

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

于 2013-09-29T13:12:52.350 回答