web.xml错误页面未过滤

5

我的应用程序正在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>
1个回答

11

这是预期行为吗?

是的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接