【问题标题】:web.xml error page not filteredweb.xml 错误页面未过滤
【发布时间】:2015-03-17 14:42:58
【问题描述】:

我的应用程序在 Tomcat 7 上运行。

我创建了一个 url 重写过滤器,它正在侦听所有传入的请求,但是,当触发错误页面时,它不会过滤它,而是过滤发生错误的页面。

我在过滤器中设置了一个断点,当错误发生时,您可以看到它在源页面上触发。 但是显示的页面是/desktop/index.xhtml

这是预期的行为吗?

这是我的web.xml 配置:

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<error-page>
    <error-code>500</error-code>
    <location>/desktop/index.xhtml?messageId=4</location>
</error-page>

【问题讨论】:

    标签: servlets servlet-filters custom-error-pages


    【解决方案1】:

    这是预期的行为吗?

    是的。

    默认情况下,过滤器仅映射到 REQUEST 调度程序。下面

    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    等价于

    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    

    这意味着,过滤器仅在“原始”传入请求时触发,而不是在转发请求或错误页面请求时触发。

    还有另外两个调度程序:FORWARDERROR。错误页面通过ERROR 调度程序在内部调度。如果你也想让你的过滤器挂在上面,那么添加它:

    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    

    请注意,您需要在此处明确指定 REQUEST 调度程序,否则它会假定您完全覆盖它并且只对 ERROR 调度程序感兴趣。

    在过滤器内部,您可以检查是否存在以RequestDispatcher#ERROR_REQUEST_URI 为键的请求属性,如果它被触发。

    String errorRequestURI = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);
    
    if (errorRequestURI != null) {
        // Error page was triggered on the given URI.
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2015-04-06
      • 1970-01-01
      • 2011-10-02
      • 2013-12-14
      • 2012-08-20
      相关资源
      最近更新 更多