我正在寻找一种解决方案,允许将外部 URL 内容加载到<iframe>JSP 页面中的元素中。但是,在显示任何内容之前,JSP 代码将首先检查包含在 iframe 的 src URL 中的 HTTP 响应,如果返回 200/OK 则显示它,否则显示自定义消息或其他页面。我只想在服务器端这样做。
有没有办法在没有可能具有潜在跨浏览器不兼容性的 AJAX/用户端脚本的情况下实现它?
您可以使用JSTL(只需将jstl-1.2.jar放入/WEB-INF/lib)c: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.com为http://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。
| 归档时间: |
|
| 查看次数: |
5507 次 |
| 最近记录: |