1

我目前正在维护一个遗留的 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 服务器重定向到这些页面?

还有其他我可能不会考虑的选择吗?

我感谢您的时间和帮助!

4

1 回答 1

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 的旧版 JSP 页面,<c:import>该页面实际上将目标 URL 的整个 HTML 响应嵌入到当前响应中,而不需要 iframe(是的,真的是 JSP;Facelets<c:import>中不支持)。

<%@taglib prefic="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:import url="http://myproduction-site.com/error/HTTP_INTERNAL_SERVER_ERROR.html" />

请注意,如果此错误页面又包含对 CSS/JS/图像文件和表单的相对URL 引用<script src="some.js">,那么它们都会失败。如果不能将它们固定为绝对 URL,那么 iframe 确实是您唯一的选择,前提是错误页面本身不包含一些破坏框架的 JavaScript(大多数现代网站都有这样的内容以防止网络钓鱼攻击)。

于 2012-11-21T02:15:35.787 回答