web.xml错误页面未过滤

时间:2015-01-19 14:48:04

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

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

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

我在过滤器中设置了断点,当错误发生时,您可以在源页面上看到它触发。 但显示的页面为/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>

1 个答案:

答案 0 :(得分:8)

  

这是预期的行为吗?

默认情况下,过滤器仅映射到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.
}