如何使用 HTTP 响应代码检查外部 URL 内容是否正确加载到 JSP 页面中的 <IFRAME>

1 java iframe jsp jstl

我正在寻找一种解决方案,允许将外部 URL 内容加载到<iframe>JSP 页面中的元素中。但是,在显示任何内容之前,JSP 代码将首先检查包含在 iframe 的 src URL 中的 HTTP 响应,如果返回 200/OK 则显示它,否则显示自定义消息或其他页面。我只想在服务器端这样做。

有没有办法在没有可能具有潜在跨浏览器不兼容性的 AJAX/用户端脚本的情况下实现它?

Bal*_*usC 5

您可以使用JSTL(只需将jstl-1.2.jar放入/WEB-INF/libc:import标签导入外部资源,FileNotFoundException如果 URL 无效,则该资源将抛出,然后可以使用 JSTLc:catch标签捕获。您最终可以使用 JSTLc:choose来检查是否显示 iframe 或最终错误。

这是一个SSCCE,复制'n'paste'n'run它(安装了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>
Run Code Online (Sandbox Code Playgroud)

更改http://google.comhttp://google.com/foo或无效的内容,您将看到错误显示。

请注意,我曾经varReader="ignore"将它缓冲但未读,因此它不会被完全拖入,这可能会很昂贵,因为毕竟您两次请求相同的 URL。

更新:或者,您可以Servlet为此使用 a ,它在 的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);
}
Run Code Online (Sandbox Code Playgroud)

......page.jsp然后就拥有类似的东西

<c:if test="${not empty url}">
    <iframe src="${url}"></iframe>
</c:if>
Run Code Online (Sandbox Code Playgroud)

将 servlet 映射到url-pattern类似的东西上/foo并调用它http:/example.com/contexty/foo而不是 JSP。