我有两个问题。首先是过滤器是否为请求增加了很多开销。我们有一个过滤器,它被设置为在 URL 模式 /* 上运行。这意味着它也可以在所有图像请求上运行。我认为这对性能不利,但我的同事认为过滤器每次请求运行 5 次或 6 次都没有关系,因为过滤器只有几个 if 语句。
有没有办法让过滤器在每个请求中运行一次,而忽略图像请求。
谢谢道格
我有两个问题。首先是过滤器是否为请求增加了很多开销。我们有一个过滤器,它被设置为在 URL 模式 /* 上运行。这意味着它也可以在所有图像请求上运行。我认为这对性能不利,但我的同事认为过滤器每次请求运行 5 次或 6 次都没有关系,因为过滤器只有几个 if 语句。
有没有办法让过滤器在每个请求中运行一次,而忽略图像请求。
谢谢道格
测量就是知道。如果写得好,我会说,它可以忽略不计。但是,如果它例如抓取会话而不管它是否已创建(因此有可能会不必要地创建它),那么它可能会对性能和/或内存使用产生显着影响,因为会话的创建不是per- se 便宜,会话存储在服务器内存中的时间比请求时间长。
您可能想要替换或url-pattern
将受限页面移动到特定文件夹,例如、、等,并相应地更改为、、等,并将所有静态内容放在不同的位置,例如。这样,过滤器将不再为静态内容调用。/*
*.jsp
/secured
/private
/pages
url-pattern
/secured/*
/private/*
/pages/*
/static
首先,我同意 Profile-first 方法。
其次,据我所知,网络服务器使用与过滤器相同的技术来调用特定的servelt(/JSP)。
如果过滤器正在过滤静态资源(例如 jpg 文件),则有点浪费,如果过滤器正在过滤动态资源(例如 Servlet),则可以忽略不计..(大多数 Java Web 框架,如 struts 和 Jboss -seam 大量使用过滤器..)
在不先分析代码的情况下推测代码的性能影响几乎没有用处。除非过滤器中提出的代码正在执行一些您知道很慢的操作,否则请在优化之前先测量。
请记住,即使在您编写 servlet 时,似乎唯一发生的事情就是您的代码doGet()
或doPost()
方法中的代码,在您的 servlet/过滤器代码被调用之前会发生很多其他事情。servlet 容器处理 HTTP 请求,将其捆绑在 Java 对象中,并在将其移交给您的代码之前进行各种其他处理。
如果您的 servlet 过滤器真的只是几个 if 语句,它对获取成本低廉的数据(例如请求本身)进行操作,那么这对您来说不太可能成为问题。