Java过滤器性能问题

5
我有两个问题。第一个是过滤器是否会给请求增加很多额外开销。我们有一个过滤器,它被设置为在URL模式/*上运行。这意味着它也会在所有图像请求上运行。我认为这对性能不利,但我的同事认为如果过滤器只有几个if语句,无论过滤器每个请求运行5次或6次都无所谓。
有没有办法使过滤器每个请求只运行一次,忽略图像请求?
谢谢 Doug

它检查用户密码是否已过期。它从会话中获取此信息。 - Doug
过滤器按定义每个请求只运行一次或两次。可能在它们所在的servlet之前和之后运行。图像是响应客户端的单独请求而提供的。 - Ian McLaird
@Ian:他们的<dispatcher>可以配置为在每个REQUEST和/或FORWARD和/或INCLUDE上运行。它默认仅在REQUEST上运行。 - BalusC
3个回答

4
测量即了解。如果编写得好,我会说它是可以忽略不计的。但是,例如无论会话是否已创建(因此有可能会不必要地创建),都抓取会话,则可能会对性能和/或内存使用产生明显影响,因为会话的创建本身并不便宜,并且会话存储在服务器的内存中比请求时间更长。
您可以将/*的url-pattern替换为*.jsp,或者将受限页面移动到特定文件夹中,例如/secured、/private、/pages等,并相应地更改url-pattern为/secured/*、/private/*、/pages/*等,并将所有静态内容放置在不同的位置,例如/static。这样,过滤器将不再对静态内容进行调用。

1
同意关于测量的问题。我们在这个问题上非常接近过早优化。 - Ian McLaird

1

首先,我同意Profile-first的方法。

其次,据我所知,这取决于Web服务器使用与过滤器相同的技术来调用特定的servlet(/JSP)。

如果过滤器正在过滤静态资源(例如jpg文件),那么这有点浪费, 如果过滤器正在过滤动态资源(例如Servlet),则可以忽略不计。 (大多数Java Web框架如Struts和Jboss-seam都在大量使用过滤器。)


0

在没有进行性能分析之前,推测代码的性能影响几乎没有任何用处。除非建议在过滤器中使用的代码正在执行一些你知道很慢的操作,然后就应该在优化之前先进行测量。

记住,即使当你编写一个 servlet 时,似乎唯一发生的事情是在你的 doGet() 或者 doPost() 方法中的代码在你的 servlet/filter 代码被调用之前会发生很多其他的事情。Servlet 容器处理 HTTP 请求,将其封装成 Java 对象,并在交给你的代码之前进行各种处理。

如果你的 servlet 过滤器确实只是几个 if 语句对便宜获取的数据(如请求本身)进行操作,则这可能不会是你的问题。


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