我目前正在维护一个传统的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服务器重定向到这些页面?
我可能没有考虑其他替代方案吗?
感谢您的时间和帮助!
答案 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(大多数现代网站都有这样做以防止网络钓鱼攻击) )。