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

时间:2012-03-05 15:06:45

标签: java java-ee servlet-filters

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

我知道我可以编写一个可以满足我想要的Servlet过滤器,但我想建立一个经过良好测试的标准解决方案,而不是重新发明轮子。我已经搜索了一个,Java EE文档中有些地方描述了这样的野兽,但是找不到我可以下载的地方。

编辑:有评论说这是一个糟糕的主意。我愿意接受更好的建议。情况是我在很长一段时间内都有很多行动,并且我想对他们的输出做各种系统修改。我不想修改所有的行为,因为这违反了DRY(并且会有很多工作)。在我看来,这正是过滤器的用途 - 基本上是AOP用于HTTP响应。我错了吗?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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


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

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


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

答案 2 :(得分:0)

你有一个难以维护的系统。现在是时候加强并从核心开始尽可能地解决问题了。弄清楚你想拥有的架构然后开始慢慢走向它。尝试使用过滤器修复问题会使可维护性变得更糟,并使组织的成本更高。