mad*_*ers 3 servlets custom-error-pages servlet-filters
我的应用程序在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>
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
是.
默认情况下,过滤器仅映射到REQUEST调度程序.下面
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
相当于
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
这意味着,过滤器仅在"原始"传入请求上触发,而不是在转发请求或错误页面请求上触发.
还有另外两名调度员:FORWARD和ERROR.错误页面通过ERROR调度程序在内部调度.如果你想让你的过滤器挂钩,那么添加它:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
请注意,您需要在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.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1556 次 |
| 最近记录: |