javax.servlet.Filter对性能的影响是什么?

8
我想知道是否有任何使用过滤器的成本相关的硬数据?例如,在使用遗产servlet共享行为和使用过滤器之间的成本方面。

谢谢,

安东尼

2个回答

17

如果有人能够发布硬数据,我会感到惊讶。即使他们这样做了,它很可能与您无关,因为数字取决于过滤器中正在执行的操作。这也很可能属于过早优化的范畴 - 除非您真的把事情搞砸了,否则它不太重要。

我假设 "heritage" 的意思是 "inheritance",并且说过滤器是一个更好的解决方案。您可以在配置中关闭和打开它们。

过滤器是HTTP请求的装饰器或方面。由于它们是受人尊敬的、经过试验的模式,为什么它们不能对servlets有用并保持安全呢?

我会说您的担忧有些过分。

话虽如此,我不建议构建如此长、复杂的过滤器链,以至于性能成为问题。如果您进行压缩、记录、性能指标等操作,并最终得到一串十几个过滤器,那么您可能会遇到问题。


3
然而,如果您需要进行压缩、记录日志、性能指标等操作,则无论是实现在过滤器中还是其他地方,所需的时间都是相同的。我唯一不喜欢过滤器的部分是深层堆栈跟踪,但这只是外观问题,远低于允许的堆栈调用深度。另外还有“过多的移动部件”问题(即配置开销)。 - Thilo
@Thilo:在Java EE 6中,您可以不使用配置。因此,这个问题也得到了解决。 - Adeel Ansari
EE6是一个重大的改进,因为XML消失了,但你仍然需要在某个地方进行配置(当然使用注释会更加友好于IDE和程序员)。 - Thilo

4

在过滤器中,没有任何可衡量的东西,完全被实际工作所掩盖。每次都不会创建一个新的过滤器实例,就像Servlet一样它们是共享的。

与继承相比的最大优点是能够在运行时进行配置和组合(父类已编译,只能有一个)。

需要考虑的一件事是,过滤器只能包装请求:它可以在之前和之后(或替代)添加代码。当Servlet运行后,响应可能已经被提交。它不能在请求处理的中间插入代码,而正确定义回调到父类(或Servlet端的其他技术)可以做到这一点。这意味着过滤器可能不适用于某些任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接