-1

sitemesh 的简单流程图(此处)显示他们检查是否第一次应用过滤器。我也在其他过滤器的代码中看到了这个检查。我无法理解可以为同一请求应用两次相同过滤器的情况。请解释。

4

1 回答 1

1

从 Servlet 2.4 开始,过滤器也可以应用于通过请求调度程序调用的请求。如果过滤器被指定为在包含或转发上运行,例如它可以执行多次。例如

<filter-mapping>
  <filter-name>Logging Filter</filter-name>
  <url-pattern>/products/*</url-pattern>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>INCLUDE</dispatcher>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>ERROR</dispatcher>
</filter-mapping>

因此,例如,当一个请求由一个 servlet 处理并且该 servlet 将该请求转发到其他地方时

httpServletRequest.getRequestDispatcher("/products/somewhereElse").forward(httpServletRequest, httpServletResponse);

,则过滤器可能会运行两次。一次用于原始请求,然后再次用于转发,提供 URL 路径和调度程序配置允许。

于 2013-01-25T14:40:36.313 回答