是否有用于包装和修改响应的JavaEE过滤器?

是否有用于包装和修改响应的JavaEE过滤器?,java,jakarta-ee,servlet-filters,Java,Jakarta Ee,Servlet Filters,我想包装并修改对Java EE/tomcat应用程序的HTTP请求的响应。也就是说,我有许多Struts 2操作可以生成结果,我想在它们上面设置一个前端,修改响应以执行隐藏链接等操作。修改每个源是不可能的,因为它们的数量和种类很多 我知道我可以编写一个Servlet过滤器来满足我的需求,但我希望基于一个标准的、经过良好测试的解决方案,而不是重新发明轮子。我已经搜索了一个,JavaEE文档中有一些地方描述了这样一个怪兽,但没有找到一个我可以下载的 编辑:有评论说这是个糟糕的主意。我愿意接受关于更好

我想包装并修改对Java EE/tomcat应用程序的HTTP请求的响应。也就是说,我有许多Struts 2操作可以生成结果,我想在它们上面设置一个前端,修改响应以执行隐藏链接等操作。修改每个源是不可能的,因为它们的数量和种类很多

我知道我可以编写一个Servlet过滤器来满足我的需求,但我希望基于一个标准的、经过良好测试的解决方案,而不是重新发明轮子。我已经搜索了一个,JavaEE文档中有一些地方描述了这样一个怪兽,但没有找到一个我可以下载的

编辑:有评论说这是个糟糕的主意。我愿意接受关于更好的建议。目前的情况是,我有大量的行动,写了很长一段时间,有各种系统的修改,我想做的输出。我不想修改所有操作,因为这违反了DRY,将是一项繁重的工作。在我看来,这正是过滤器的用途——本质上是HTTP响应的AOP。我想错了吗


编辑2:至于变化的意义,很难说。从向页面添加大量新内容的意义上来说,这通常并不重要。它更多的是扫描响应并进行相对较小的更改:例如,在特定条件下向链接添加类,在页面的不同位置注入少量代码,或者在极端情况下剪切用户不应该看到的div。我想说的是,最大的问题是,该系统由大约4000个独特的页面组成,每个页面由使用几种不同技术的单独操作和/或视图生成。我们可以说这个系统结构很糟糕,但这就是在一个非常大、有15年历史的软件上工作的现实。我的另一个想法是只实现一个过滤器来进行扫描,并在javascript中注入修改。这在真正与安全相关的情况下(即不想让用户看到内容)没有帮助,但在一些主要为了用户方便而进行的其他情况下,这可能会有所帮助。谢谢大家的讨论,请继续讨论。

这听起来是一个非常糟糕的想法,但是看看URLRewite filter,它可以让你做任何你想做的事情。您还可以看看

您的系统很难维护。是时候变得坚强起来,从核心开始尽你所能地处理这个问题了。找出一个你想要的架构,然后开始慢慢地朝这个方向发展。试图在顶部安装一个过滤器来解决问题会使可维护性变差,并增加组织的成本。

如果您的更改可以分类,我建议使用jQuery。 您所要做的就是将jQuery添加到页面中,根据您的条件选择标记,然后对它们应用所需的内容

如果你有一个布局管理器,我相信如果它是Struts 2应用程序,你必须有SiteMesh或Tiles,你可以在你的布局模板中添加你需要的东西,一切都会好的

我想到的另一个解决方案是,如果您在项目中使用了一致的标记库,那么它是可以应用的。例如,如果您使用了标记所有项目,即使它们是struts2标准标记,或者……,您也可以重新实现标记,然后将它们指定给TLD文件中的旧名称

我相信我以前的jQuery解决方案和这个重新实现标记的解决方案的结合会给您带来很大的帮助,而且比解析结果DOM并重新创建它要容易得多,性能也要高得多


另一种解决方案是,如果结果页是格式良好的XHTML XML,则可以使用XSLT转换器将XHTML转换为另一个XHTML。

那么您想解析响应、修改DOM并将其发送回吗?哎呀。如果你能提供一些你需要做的具体工作的细节。这个变化实际上是一个重大的变化吗?您有理由认为这需要大量的工作,而使用servlet过滤器显然是一种黑客行为?或者现有的代码,结构不是很好,所以应该是一个小的改变,实际上是大的和有风险的吗?我编辑了我的文本,以纳入您的问题。谢谢你的回复。对不起,我没有回复。下面的Rick Mangi总结得很好。你提出的建议听起来很糟糕,但是如果你不得不做这些修改,并且代码库不是很好,那么这肯定是一种方法。但请注意,这是一个黑客,这将使以后的维护更加困难。在某种程度上,您必须咬紧牙关,修复底层代码或扔掉它:-我熟悉URL重写过滤器,但我认为这本质上是针对java的mod_rewrite,因此不支持只修改结果URI
对你的servlet,我会重新考虑过滤器的想法。性能开销将使用户体验变得糟糕。如果你正在做的事情比那简单,那就去做吧。我会考虑制作一个小助手库来做你需要的,并在需要它的所有servlet /动作中使用它。URL重写过滤器将让你做任何你想要的与ReGEXP匹配的请求,甚至任何请求。您完全可以使用它在请求进入/退出servlet堆栈的过程中针对请求运行任何您想要的操作。我不认为你想做的是好的设计,但如果这是你的要求,这是一种方法。阿米尔-我不知道你的意思。如果我做错了什么,我保证这不是故意的。我应该做些与我不同的事情吗?