【问题标题】:Java Filters Performance QuestionJava 过滤器性能问题
【发布时间】:2011-03-19 17:51:01
【问题描述】:

我有两个问题。首先是过滤器是否为请求增加了很多开销。我们有一个过滤器,它被设置为在 URL 模式 /* 上运行。这意味着它也可以在所有图像请求上运行。我认为这对性能不利,但我的同事认为过滤器每次请求运行 5 次或 6 次都没有关系,因为过滤器只有几个 if 语句。

有没有办法让过滤器在每个请求中运行一次,而忽略图像请求。

谢谢道格

【问题讨论】:

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

标签: java performance servlets premature-optimization servlet-filters


【解决方案1】:

衡量就是知道。如果写得好,我会说,它可以忽略不计。但是,如果它例如抓取会话而不管它是否已创建(因此有可能会不必要地创建它),那么它可能会对性能和/或内存使用产生显着影响,因为会话的创建不是per-价格便宜,会话存储在服务器内存中的时间比请求时间长。

您可能希望将 /*url-pattern 替换为 *.jsp 或将受限页面移动到特定文件夹,例如/secured/private/pages 等并将url-pattern 相应地更改为/secured/*/private/*/pages/* 等,并将所有静态内容放在不同的位置,例如/static。这样就不会再为静态内容调用过滤器了。

【讨论】:

  • 同意测量。我们正在对这个问题进行非常接近过早的优化。
【解决方案2】:

如果不先分析代码,就推测代码的性能影响几乎没有用处。除非过滤器中提出的代码正在执行一些您知道会很慢的操作,否则请在优化之前先测量。

请记住,即使在您编写 servlet 时,似乎唯一发生的事情就是您的 doGet()doPost() 方法中的代码 在您的 servlet/过滤器代码获取之前发生了很多其他事情调用。 servlet 容器处理 HTTP 请求,将其捆绑在 Java 对象中,并在移交给您的代码之前执行各种其他处理。

如果您的 servlet 过滤器真的只是几个 if 语句,对获取成本较低的数据(例如请求本身)进行操作,那么这对您来说不太可能成为问题。

【讨论】:

    【解决方案3】:

    首先,我同意个人资料优先的方法。

    其次,据我所知,网络服务器使用与过滤器相同的技术来调用特定的servelt(/JSP)。

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

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 2016-03-09
      • 1970-01-01
      • 2021-12-22
      • 2017-01-31
      • 2011-01-12
      相关资源
      最近更新 更多