【问题标题】: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 上调用。为此,您必须在过滤器映射中明确指定 &lt;dispatcher&gt; 条目。

    也许您正在使用 Servlet 2.3?在那个古老的版本中,默认情况下,任何过滤器都确实在转发时调用。您需要至少升级到 Servlet 2.4,或者让过滤器检查是否存在 javax.servlet.forward.request_uri 属性,如果存在,则只需调用 chain.doFilter(request, response) 即可绕过过滤器调用。

    或者也许您是实际上重定向而不是转发?在这种情况下,您应该执行真正的forward 而不是redirect。

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 2011-11-30
      • 2013-04-12
      • 2011-12-18
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2014-09-13
      • 2015-04-09
      相关资源
      最近更新 更多