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