我正在研究一种解决方案,它允许将外部URL内容加载到JSP页面的<iframe>元素中。但是,在显示任何内容之前,JSP代码将首先检查iframe的src URL中包含的HTTP响应,如果返回200/OK,则显示它,否则将显示自定义消息或另一个页面。我只想在服务器端做这件事。
有没有一种方法可以在不使用AJAX /用户端脚本的情况下实现它,这可能会有潜在的跨浏览器不兼容性?
发布于 2010-02-19 02:58:56
您可以使用JSTL (just drop jstl-1.2.jar in /WEB-INF/lib) c:import标签来导入外部资源,如果URL无效,则会抛出FileNotFoundException,然后可以使用c:catch标签捕获该URL。最后,您可以使用JSTL来检查是否显示c:choose或最终的错误。
这是一个SSCCE,复制‘n’粘贴‘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,它在java.net.URLConnection的帮助下在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);
}page.jsp中的...and只需如下所示
<c:if test="${not empty url}">
<iframe src="${url}"></iframe>
</c:if>将servlet映射到/foo之类的url-pattern上,并在http:/example.com/contexty/foo上调用它。
发布于 2010-02-19 04:22:35
<iframe>的实际加载将会发生,因为客户端会加载它。肯定有更好的方法来验证URL,而不是试图通过JSP包含它。用Java做,或者干脆根本不做:让服务器返回一个“找不到”的页面,该页面运行一些Javascript来隐藏iframe。(如果用户在关闭Javascript的情况下浏览,则会显示错误。)
https://stackoverflow.com/questions/2291085
复制相似问题