Java 编写处理所有特殊响应情况的通用httpservletresponsewrapper';大型web应用程序中的内容类型?

Java 编写处理所有特殊响应情况的通用httpservletresponsewrapper';大型web应用程序中的内容类型?,java,servlet-filters,Java,Servlet Filters,我正在定制一个大型COTS内容管理系统,称为 Confluence返回许多不同类型的httpservletresponses(文本/ascii、图像/png、图像/jpg、microsoft powerpoint文件、PDF文件等) 我已经写了一篇文章,试图通过写出一小组字节来修改发送回客户端的所有响应。这在很大程度上是有效的。但是,我必须不断检查特殊情况,如powerpoint文件、PDF、PNG等。。如果用户碰巧正在下载此类内容,我根本不会修改响应。修改响应会中断正在向客户端提供的power

我正在定制一个大型COTS内容管理系统,称为

Confluence返回许多不同类型的httpservletresponses(文本/ascii、图像/png、图像/jpg、microsoft powerpoint文件、PDF文件等)

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

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

我在谷歌上搜索了一下,发现了这个


我在寻找类似于这个例子的东西,但我希望有人能向我解释幕后发生了什么,以及我是否能以更聪明的方式解决这个问题

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

你不知道你在做什么,也不知道为什么内容类型很重要,也不知道为什么你不在乎(只是路过)的“特殊”内容类型很重要

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

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

当然,您的处理程序可以实现过滤器链的许多部分,并充当代理过滤器,因此您的处理程序可以执行过滤器可以执行的任何操作


此外,您的筛选器可能会干扰更高阶的HTTP处理(特别是块传递、范围支持、Etag和缓存支持等)。如果响应是text/html,我可以写出我的自定义字节(这是一个JSON字符串,稍后将由java脚本解析,以便执行一些与GUI相关的活动)。内容类型很重要,因为我根本无法将JSON写入PNG、PDF、Powerpoint、MS Word、Excel、音频、视频,而且列表还在继续。。理想情况下,我想要一个可以永久注册的所有内容类型的有限列表。如果我不能得到一个有限的内容类型列表,那么我想找出一个更聪明的方法来解决这个问题,而不是等到下一个问题。