sitemesh(here)的简单流程图显示它们检查是否是第一次应用过滤器。我也看过其他过滤器代码中的这个检查。我无法理解可以为同一请求应用两次相同过滤器的情况。请解释一下。
答案 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路径和调度程序配置允许。