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

时间:2010-02-18 18:22:38

标签: java jsp iframe jstl

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

如果没有可能存在跨浏览器不兼容性的AJAX /用户端脚本,是否有办法实现?

2 个答案:

答案 0 :(得分:4)

您可以使用JSTL(只需在/WEB-INF/libjstl-1.2.jar标记中删除c:import即可导入外部资源,如果是FileNotFoundException网址无效,而后者又可以使用JSTL c:catch标记进行捕获。您最后可以使用JSTL c:choose来检查是否显示iframe或最终错误。

这是一个SSCCE,copy'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>

http://google.com更改为http://google.com/foo或其他无效内容,您会看到错误显示。

请注意,我使用varReader="ignore"对其进行了缓冲但未读取,因此它不会完全拖延,因为这可能会很昂贵,因为毕竟你要求两次相同的网址。

更新:或者,您可以使用ServletdoGet()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); } 方法的帮助下预处理请求java.net.URLConnection。这是一个启动的例子。

page.jsp

...并且在<c:if test="${not empty url}"> <iframe src="${url}"></iframe> </c:if> 中只有类似

的内容
url-pattern

将servlet映射到类似/foo的{​​{1}}上,并在http:/example.com/contexty/foo而不是JSP上调用它。

答案 1 :(得分:0)

<iframe>的实际加载将会发生,因为客户端会加载它。有一种更好的验证URL的方法,而不是尝试通过JSP包含它。在Java中执行,或者根本不执行:让服务器返回“未找到”页面,该页面运行一些Javascript来隐藏iframe。 (对于使用Javascript关闭浏览的人来说,它是否显示错误。)