web.xml 错误页面未过滤
web.xml error page not filtered
我的申请是 运行 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>
Is it the expected behavior ?
是的。
过滤器默认仅映射到 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>
这意味着,过滤器仅在 "raw" 传入请求上触发,而不是在转发请求或错误页面请求上触发。
还有另外两个调度程序:FORWARD
和 ERROR
。错误页面通过 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.
}
我的申请是 运行 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>
Is it the expected behavior ?
是的。
过滤器默认仅映射到 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>
这意味着,过滤器仅在 "raw" 传入请求上触发,而不是在转发请求或错误页面请求上触发。
还有另外两个调度程序:FORWARD
和 ERROR
。错误页面通过 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.
}