我正在寻找一种解决方案,允许将外部URL内容加载到JSP页面中的<iframe>
元素中。
但是,在显示任何内容之前,JSP代码将首先检查iframe的src URL中包含的HTTP响应,如果返回200 / OK,则显示它,否则显示自定义消息或其他页面。我只想在服务器端这样做。
如果没有可能存在跨浏览器不兼容性的AJAX /用户端脚本,是否有办法实现?
答案 0 :(得分:4)
您可以使用JSTL(只需在/WEB-INF/lib
)jstl-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"
对其进行了缓冲但未读取,因此它不会完全拖延,因为这可能会很昂贵,因为毕竟你要求两次相同的网址。
更新:或者,您可以使用Servlet
来doGet()
在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关闭浏览的人来说,它是否显示错误。)