【问题标题】:Tomcat - display Image inside of WEB-INFTomcat - 在 WEB-INF 中显示图像
【发布时间】:2017-12-05 08:01:49
【问题描述】:

我目前正在开发一个 JSP/Servlet 应用程序,并且不希望其他不拥有它们的用户可以访问私有图片。

我的问题是用户可以通过在他们的 html 查看器中简单地重写路径来访问资产,这就是为什么我必须将图片放入 WEB-INF 文件夹中,以使它们不能从外部访问。

图片位于/tomcat/myProject/ROOT/WEB-INF/Users/%userName%/

但现在图像在 WEB-INF 中,我无法使用我的 servlet 加载它们。

有人知道如何访问图片,将其保存在会话属性中,并且只让请求 JSP 的用户可见吗?

编辑: 我将 Kaleb Brasee 的代码插入到我的方法中:

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ...
    BufferedImage image = ImageIO.read(new File(profilePicturePath));
    OutputStream responseStream = response.getOutputStream();
    ImageIO.write(image, "JPEG", responseStream);
    //session.setAttribute("profilepicture", PLACEHOLDER);  //PLACEHOLDER should be replaced by the actual Image, but I dont know how to do this
    //response.sendRedirect("/Index"); //doesnt get executed, because ImageIO.write(...) already commits a response before this line of code is reached
}

执行时,上面的代码将显示一个带有img标签的html页面,其中包含来自WEB-INF文件夹的图像,但没有其他内容。

这不是所需的行为,我需要将ImageIO.write(...) 输出保存为会话属性,以便我可以将其插入到我的/Index JSP 页面内的特定位置。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

    您可以创建一个将图像 ID 作为请求参数的 servlet。如果用户有权查看文件,则将其写入输出流,否则返回 HTTP 错误响应。

    ImageIO.write 方法可用于将加载的图像写入 HttpServletResponse OutputStream。

    在加载 PNG 并将其写入响应之前,我使用了一些代码,如下所示:

    response.setContentType("image/png");
    BufferedImage image = generateImage(); // my custom method to create an image
    OutputStream responseStream = response.getOutputStream();
    ImageIO.write(image, "PNG", responseStream);
    

    【讨论】:

    • 感谢您的回答,现在去研究一下
    • 好吧图片现在好像加载了,但是占满了整个html文档,你知道怎么把图片保存为会话属性吗?
    • 您可以通过request.getSession().setAttribute() 将任何内容设置为会话属性。但是,随着应用程序的扩展,在会话中存储像图像一样大的东西是有问题的,因为它会占用大量的 RAM。
    • 嘿 Kaleb Brasee,感谢到目前为止的帮助,我尝试解决问题几个小时,但仍然无法正常工作。我更新了我原来的帖子,你能看看吗?
    • 您是否考虑过制作一个单独的 servlet 来显示图像,然后从索引 JSP 文件中引用该 servlet?例如,创建一个 ImageServlet.java 类,在 web.xml 中将其设置为 /image 映射,然后让主 index.jsp 使用 <img src="/image?id=<c:out value="${imageId}" />" /> 标记。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2013-06-20
    相关资源
    最近更新 更多