为JSF应用程序指定外部错误页面

时间:2012-11-20 23:40:55

标签: java jsf external custom-error-pages

我目前正在维护一个传统的ICEFaces 1.8.2 Web应用程序,我想知道是否可以在应用程序生成错误时在其web.xml文件中定义外部URL。

当然,主要原因不是向客户显示默认的Tomcat 6错误页面。此外,我无法在应用程序的.war文件中包含内容,因为我公司的其他部门正在管理这些页面的内容。

特别是,我有兴趣显示错误404,500和503的自定义页面。

我尝试在应用程序的web.xml文件中进行此修改:

<error-page>
    <error-code>500</error-code>
    <location>http://myproduction-site.com/error/HTTP_INTERNAL_SERVER_ERROR.html</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>http://myproduction-site.com/error/HTTP_NOT_FOUND.html</location>
</error-page>

但是,我认为在web.xml文件中指定这些值是非法的。

如果有帮助,我的Tomcat 6服务器前面会有几个Apache服务器通过粘性会话进行负载平衡。是否有可能在Tomcat服务器内发生错误时指示Apache服务器重定向到这些页面?

我可能没有考虑其他替代方案吗?

感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:0)

web.xml无法做到这一点。

错误页面位置必须完全引用资源路径,该路径在作为参数传递给RequestDispatcher#forward()时将产生所需的结果。该方法不接受外部URL。它只接受webapp自己的资源。

您最好的选择是在本地创建错误页面,然后导入外部错误页面。其中一种方法是使用HTML <iframe>,如下所示:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>HTTP Internal Server Error</title>
        <style>
            html, body, iframe {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
            }
            html, body {
                overflow: hidden;
            }
        </style>
    </head>
    <body>
        <iframe src="http://myproduction-site.com/error/HTTP_INTERNAL_SERVER_ERROR.html"></iframe>
    </body>
</html>

另一种方法是使用带有JSTL <c:import>的遗留JSP页面,它实际上将目标URL的整个HTML响应嵌入到当前响应中,而不需要iframe(是的,真的是JSP; {{1 Facelets中不支持}。

<c:import>

请注意,如果此错误页面包含相对 URL对CSS / JS /图像文件和<%@taglib prefic="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:import url="http://myproduction-site.com/error/HTTP_INTERNAL_SERVER_ERROR.html" /> 等表单的引用,那么它们都会失败。如果无法将它们固定为绝对URL,那么iframe实际上是您唯一的选择,只要错误页面本身不包含某些突破框架的JavaScript(大多数现代网站都有这样做以防止网络钓鱼攻击) )。