0

我正在定制一个名为Confluence的大型 COTS 内容管理系统。

Confluence 返回许多不同类型的 httpservlet 响应(text/ascii、image/png、image/jpg、microsoft powerpoint 文件、PDF 文件等)。

我编写了一个servletfilter,它试图通过写出一小组字节来修改发送回客户端的所有响应。这在大多数情况下效果很好。但是,我必须不断检查诸如 powerpoint 文件或 PDF、PNG 等特殊情况。如果用户碰巧正在下载此类内容,我根本不会修改响应。修改响应会中断正在提供给客户端的 powerpoint 字节或 PDF 字节流。通过简单地检查这些特殊情况而不写出我的任何字节,我的问题就解决了。但我觉得更大的问题是可能还有更多我没有想到的案例(也许是音频和视频)或者谁知道呢。当我了解到这些特殊情况时,我将不得不继续玩检查这些特殊情况的游戏。

我想知道是否有更聪明的方法来处理这个问题。

我做了一个谷歌,我遇到了这个例子

我正在寻找与此示例类似的东西,但我希望有人可以向我解释幕后发生的事情,以及我是否能以更聪明的方式解决这个问题。

4

1 回答 1

1

过滤器示例有点不完整,但它似乎正在做的事情的要点是将整个响应缓冲到一个字节数组中,以后可以用它做任何你想做的事情。我认为这意味着您可能会扩展此过滤器,然后在过滤器链触发后调用 getData() ,然后执行处理。

你不说你在做什么,或者为什么内容类型很重要,或者为什么你不关心(你只是通过)的“特殊”内容类型很重要。

您可以做的是,您可以为类创建内容类型处理程序的注册表。然后,当您检测到出站请求的内容类型时,您可以分派给适当的处理程序。这些处理程序可以简单地表示为内容类型的映射 -> 处理程序的类名,对于任何未注册的内容类型,默认传递“什么都不做”处理程序。您可以从属性文件、过滤器配置或数据库中的表加载该映射。

虽然只缓冲整个输出流然后对其进行操作似乎很有吸引力,但我建议不要这样做。想象一下,如果用户正在下载一个大的(10 到 100 的 MB)PDF 或视频或其他东西,内存压力。也许您的大部分内容都适合缓冲,但很可能有些内容不适合。

当然,您的处理程序可以实现过滤器链的许多部分,并充当代理过滤器,因此您的处理程序可以做任何过滤器可以做的事情。

此外,您的过滤器可能会干扰更高阶的 HTTP 处理(特别是块传递、范围支持、Etag 和缓存支持等)。必须重做这些东西可能会很痛苦。

于 2013-06-16T03:56:48.773 回答