【问题标题】:Using separate filters for seperate servlet requests; prevent filter being invoked by a forward on the servlet对单独的 servlet 请求使用单独的过滤器;防止过滤器被 servlet 上的转发调用
【发布时间】:2012-11-05 15:47:17
【问题描述】:
我想为 2 个单独的 servlet 使用 2 个过滤器。第一个过滤器用于第一个 servlet:foodtypeServlet,第二个过滤器用于第二个 servlet:menuServlet。在第二个过滤器中,当有错误时,我想转发到foodtypeServlet。但问题是,当我转发到foodtypeServlet 时,这个 servlet 的过滤器也会被执行。我不希望它被执行。我怎样才能实现它?
【问题讨论】:
标签:
servlets
servlet-filters
【解决方案1】:
这不是假设过滤器映射如下的默认行为:
<filter-mapping>
<filter-name>foodtypeFilter</filter-name>
<servlet-name>foodtypeServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>menuFilter</filter-name>
<servlet-name>menuServlet</servlet-name>
</filter-mapping>
默认情况下,过滤器仅在 REQUEST 调度程序上调用,而不是在 FORWARD、INCLUDE 或 ERROR 上调用。为此,您必须在过滤器映射中明确指定 <dispatcher> 条目。
也许您正在使用 Servlet 2.3?在那个古老的版本中,默认情况下,任何过滤器都确实在转发时调用。您需要至少升级到 Servlet 2.4,或者让过滤器检查是否存在 javax.servlet.forward.request_uri 属性,如果存在,则只需调用 chain.doFilter(request, response) 即可绕过过滤器调用。
或者也许您是实际上重定向而不是转发?在这种情况下,您应该执行真正的forward 而不是redirect。