【问题标题】:Is there a Java EE filter for wrapping and modifying responses?是否有用于包装和修改响应的 Java EE 过滤器?
【发布时间】:2012-03-23 01:22:17
【问题描述】:

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

我知道我可以编写一个 Servlet 过滤器来做我想做的事,但我想构建一个标准的、经过充分测试的解决方案,而不是重新发明轮子。我已经搜索了一个,Java EE 文档中有一些地方描述了这种野兽,但找不到可以下载的。

编辑:有些 cmets 认为这是一个糟糕的主意。我愿意接受关于更好的建议。情况是我有大量的动作,写了很长一段时间,我想对它们的输出进行各种系统的修改。我不想修改所有操作,因为这违反了 DRY(并且会做大量工作)。在我看来,这正是过滤器的用途——本质上是用于 HTTP 响应的 AOP。我想错了吗?

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

【问题讨论】:

  • 所以你想解析响应,修改DOM,然后发回?糟糕。
  • 如果你提供了一些关于你需要做的确切工作的更多细节。更改实际上是否是一项重大更改,您可以合理地期望这需要大量工作(并且使用 servlet 过滤器显然是一种 hack)?还是现有的代码,结构不是很好,所以应该是一个小的改动,实际上是大的和有风险的?
  • 我编辑了我的文字以包含您的问题。感谢您的回复。
  • 对不起,我没有回复。下面的 Rick Mangi 总结得很好。您提出的建议听起来很讨厌,但是如果您必须进行这些更改并且使用的代码库不是很好,那么这当然是一种方法。但请注意,这是一个 hack,这将使以后的维护变得更加困难。在某些时候,您必须硬着头皮修复底层代码(或将其扔掉:-))

标签: java jakarta-ee servlet-filters


【解决方案1】:

这听起来像是一个非常可怕的想法,但请看一下 urlrewrite 过滤器http://www.tuckey.org/urlrewrite/,它可以让您做几乎任何您想做的事情。你也可以看看http://www.sitemesh.org/

【讨论】:

  • 我熟悉 URL 重写过滤器,但我认为它本质上是 java 的 mod_rewrite,因此不支持修改结果(仅限 URI)。
  • 如果您必须解析 servlet 的输出根本,那么我会重新考虑过滤器的想法。性能开销将使用户体验变得糟糕。如果您正在做的事情比这更简单,那么请继续。我会考虑制作一个小助手库来做你需要的事情,并在所有需要它的 servlet/actions 中使用它。
  • URL 重写过滤器可让您对匹配正则表达式的请求甚至任何请求执行任何操作。您绝对可以使用它来针对进出 servlet 堆栈的请求运行任何您想要的东西。我不认为你想要做的是好的设计,但如果这是你的要求,这是一种方法。
【解决方案2】:

您的系统难以维护。是时候硬着头皮开始处理问题了,尽你所能,从核心开始。找出你想要的架构,然后开始慢慢地朝着那个方向前进。尝试在顶部使用过滤器来修复问题会使可维护性更差,并且组织的成本也会更高。

【讨论】:

    【解决方案3】:

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

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


    如果您在项目中使用了一致的标签库,我想到的另一个解决方案是适用的。例如,如果您在所有项目中都使用了<xyz:myLink/> 标记(即使它们是 Strtus2 标准标记,或者....),您可以重新实现标记,然后将它们分配给 TLD 文件中的旧名称。

    我相信我之前的解决方案(jQuery)和这个解决方案(重新实现标签)的组合可以帮助你很多,它会比解析结果 DOM 并重新创建它更容易和更高效。


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

    【讨论】:

    • 阿米尔 - 我不确定你的意思。如果我做错了什么,我保证这不是故意的。我应该做一些与我不同的事情吗?
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 2019-01-20
    • 2012-02-29
    • 2017-06-25
    • 2020-07-21
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多