Указание страниц с внешними ошибками для приложений JSF
В настоящее время я поддерживаю устаревшее веб-приложение ICEFaces 1.8.2, и мне было интересно, смогу ли я определить внешние URL-адреса внутри его web.xml
файл для всякий раз, когда приложение генерирует ошибку.
Основная причина, конечно, не в том, чтобы показать клиенту страницу ошибки 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, которые выполняют балансировку нагрузки с помощью липких сессий. Можно ли было бы дать указание серверам Apache перенаправлять на эти страницы при возникновении ошибки на серверах Tomcat?
Есть ли другая альтернатива, которую я не рассматриваю?
Я благодарю вас за ваше время и помощь!
1 ответ
Это невозможно web.xml
,
Расположение страницы ошибки должно точно указывать путь к ресурсу, который будет давать желаемый результат при передаче в качестве аргумента RequestDispatcher#forward()
, Этот метод не принимает внешние URL-адреса. Он принимает только собственные ресурсы веб-приложения.
Лучше всего создавать страницы ошибок локально, которые, в свою очередь, импортируют страницы внешних ошибок. Одним из способов будет использование 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>
Другой способ - использовать устаревшую JSP-страницу с JSTL. <c:import>
который буквально встраивает весь HTML-ответ целевого URL в текущий ответ без необходимости использования iframe (да, действительно JSP; <c:import>
не поддерживается в Facelets).
<%@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-ссылки на файлы CSS/JS/ изображения и такие формы, как <script src="some.js">
тогда они все потерпят неудачу. Если они не могут быть зафиксированы как абсолютные URL-адреса, тогда iframe - это действительно ваш единственный вариант, при условии, что на самой странице ошибок нет некоторого JavaScript-кода, который выходит за рамки (большинство современных веб-сайтов имеют это для предотвращения фишинговых атак).).