我有两个问题。第一个是过滤器是否会给请求增加很多额外开销。我们有一个过滤器,它被设置为在URL模式/*上运行。这意味着它也会在所有图像请求上运行。我认为这对性能不利,但我的同事认为如果过滤器只有几个if语句,无论过滤器每个请求运行5次或6次都无所谓。
有没有办法使过滤器每个请求只运行一次,忽略图像请求?
谢谢 Doug
有没有办法使过滤器每个请求只运行一次,忽略图像请求?
谢谢 Doug
首先,我同意Profile-first的方法。
其次,据我所知,这取决于Web服务器使用与过滤器相同的技术来调用特定的servlet(/JSP)。
如果过滤器正在过滤静态资源(例如jpg文件),那么这有点浪费, 如果过滤器正在过滤动态资源(例如Servlet),则可以忽略不计。 (大多数Java Web框架如Struts和Jboss-seam都在大量使用过滤器。)
在没有进行性能分析之前,推测代码的性能影响几乎没有任何用处。除非建议在过滤器中使用的代码正在执行一些你知道很慢的操作,然后就应该在优化之前先进行测量。
记住,即使当你编写一个 servlet 时,似乎唯一发生的事情是在你的 doGet()
或者 doPost()
方法中的代码在你的 servlet/filter 代码被调用之前会发生很多其他的事情。Servlet 容器处理 HTTP 请求,将其封装成 Java 对象,并在交给你的代码之前进行各种处理。
如果你的 servlet 过滤器确实只是几个 if 语句对便宜获取的数据(如请求本身)进行操作,则这可能不会是你的问题。
<dispatcher>
可以配置为在每个REQUEST
和/或FORWARD
和/或INCLUDE
上运行。它默认仅在REQUEST
上运行。 - BalusC