我有一个内容脚本,在Web浏览器页面的顶部显示一个浮动div。 div通过jQuery.load或jQuery.get填充了我的Web应用程序的一些内容(在www.my.app/my/page上说)。
虽然页面的HTML内容正常,但未加载图像等资源。为图像生成的HTML看起来像
<img src=/my/image/path>
如果内容脚本应用于网站www.asite.com,浏览器将尝试从www.asite.com/my/image/path获取图像,而不是www.my.app/my/image/路径。
使用
从jsf生成相关图像 <p:graphicImage value="#{tagImageController.imageFileContent}"/>
并在正确的上下文中(在正确的域上)正常工作。如果我的内容脚本使用iframe而不是div,则可以正常工作。
这是imageFileContent函数:
public StreamedContent getImageFileContent() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Map<String, String> requestParameterMap = externalContext.getRequestParameterMap();
String tagIdStr = requestParameterMap.get("tag_id");
if (tagIdStr == null || tagIdStr.isEmpty()) {
streamedContent = defaultStreamedContent;
} else {
long tagId = Long.parseLong(tagIdStr);
Tag tag = tagService.findTag(tagId);
if (tag == null) {
streamedContent = defaultStreamedContent;
}
streamedContent = loadImageStreamedContent(tag);
}
return streamedContent;
}
由于
答案 0 :(得分:0)
您无法使用流内容控制<p:graphicImage>
的域名。
只需使用普通HTML <img>
,@WebServlet
提供动态图片内容即可。然后,您可以完全控制<img>
的域名。
E.g。
<img src="//www.my.app/my/image/path" />
有这样的东西
@WebServlet("/image/*")
public class ImageServlet extends HttpServlet {
@EJB
private SomeImageService someImageService;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = request.getPathInfo().substring(1);
Image image = someImageService.findSomehowBy(path);
String filename = image.getFilename();
byte[] content = image.getContent();
response.setHeader("Content-Type", getServletContext().getMimetype(filename));
response.setHeader("Content-Length", String.valueOf(content.length));
response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
response.getOutputStream().write(content);
}
}