Как проверить, правильно ли загружается внешний URL-адрес в <IFRAME>на странице JSP, используя код ответа HTTP - PullRequest
1 голос
/ 18 февраля 2010

Я ищу решение, которое позволило бы загружать содержимое внешнего URL в элемент <iframe> на странице JSP.Однако перед отображением какого-либо содержимого код JSP сначала проверит HTTP-ответ, включенный в URL-адрес iframe src, и, если возвращается 200 / OK, отобразит его, в противном случае вместо него отобразится пользовательское сообщение или другая страница.Я хотел бы сделать это только на стороне сервера.

Есть ли способ достичь этого без сценариев на стороне AJAX / на стороне пользователя, которые могут иметь потенциальную несовместимость между браузерами?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2010

Вы можете использовать тег JSTL (просто перетащите jstl-1.2.jar in /WEB-INF/lib) c:import для импорта внешнего ресурса,который выдаст FileNotFoundException, если URL недействителен, что, в свою очередь, может быть отслежено с помощью тега JSTL c:catch.Наконец, вы можете использовать JSTL c:choose, чтобы проверить, отображать ли iframe или возможную ошибку.

Вот SSCCE , copy'n'paste'n 'запустите его (с установленным JSTL):

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2291085</title>
    </head>
    <body>
        <c:set var="url" value="http://google.com" />
        <c:catch var="e">
            <c:import url="${url}" varReader="ignore" />
        </c:catch>
        <c:choose>
            <c:when test="${empty e}">
                <iframe src="${url}"></iframe>
            </c:when>
            <c:otherwise>
                <p>Error! ${e}</p>
            </c:otherwise>
        </c:choose>
    </body>
</html>

Измените http://google.com на http://google.com/foo или что-то недопустимое, вы увидите вместо этого ошибку.

Обратите внимание, что я использовал varReader="ignore" чтобы он был буферизован, но не прочитан, так что он не будет полностью доставлен, что может быть дорогостоящим, потому что в конце концов вы запрашиваете один и тот же URL дважды.

Обновление : В качестве альтернативы,для этого вы можете использовать Servlet, который предварительно обрабатывает запрос внутри метода doGet() с помощью java.net.URLConnection.Вот пример стартапа.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    URL url = new URL("http://google.com");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    int status = connection.getResponseCode(); // 200 = OK, 404 = Not Found, etc.

    if (status == 200) {
        request.setAttribute("url", url);
    } else {
        // Do your thing to set custom message or request another page.
    }

    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

... а в page.jsp тогда просто есть что-то вроде

<c:if test="${not empty url}">
    <iframe src="${url}"></iframe>
</c:if>

Отобразите сервлет на url-pattern чего-то вроде /fooи позвоните на http:/example.com/contexty/foo вместо JSP.

0 голосов
/ 18 февраля 2010

Фактическая загрузка <iframe> произойдет, потому что клиент загружает ее. Просто есть лучшие способы проверки URL, чем пытаться включить его через JSP. Сделайте это на Java или просто не делайте этого вообще: пусть сервер вернет страницу «не найден», которая запускает некоторый Javascript, чтобы скрыть iframe. (Отобразить ошибку для людей, просматривающих с отключенным Javascript.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...