为什么我们要检查在sitemesh和其他地方应用两次的过滤器?

时间:2013-01-25 09:42:11

标签: java java-ee servlet-filters sitemesh

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

1 个答案:

答案 0 :(得分:1)

从Servlet 2.4开始,过滤器也可以应用于通过request dispatcher调用的请求。如果指定过滤器在包含或前向运行,例如它可以多次执行。 e.g。

<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路径和调度程序配置允许。

相关问题