Указание страниц с внешними ошибками для приложений 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-кода, который выходит за рамки (большинство современных веб-сайтов имеют это для предотвращения фишинговых атак).).

Другие вопросы по тегам