0

我有一个具有以下结构的 JSP 页面:

<input type='file' id='logo' />
<iframe src='view?media=logo'></iframe>

我在这里要做的是让用户选择一个图像,然后我会将它上传到服务器上“WEB-INF”内的一个目录。我已经成功实现了服务器端这意味着我可以看到复制到目标文件夹的新图像。但是我需要能够向客户展示图像。由于图像位于“WEB-INF”文件夹中,我无法通过使用“img”元素并操作它的“src”属性来实现。所以我实现了另一个带有 URL 模式“视图”的 servlet。此 servlet 接收客户端请求的媒体(在本例中为“徽标”)并使用以下代码将页面转发到请求的资源:

String media = request.getParameter("media");    
String location = FileManager.getView(media);
getServletContext().getRequestDispatcher(location).forward(request, response);

因此,如果一切按计划进行,则最近上传的图像应显示在 iframe 内。

问题是 iram 一直显示与我的请求相关的旧图像,但是当我右键单击图像并选择“在新窗口中打开”时,我看到了更正后的图像。

我做了一些研究,发现这个问题在某种程度上与浏览器缓存图像有关,解决方案建议浪费在“src”属性的末尾添加一个随机数:

<img src='logo.png?random=klafjeiej3qk213 />

虽然我无法将此修复应用于我的问题,因为图像存储在 WEB-INF 中,并且我使用 servlet 来检索它们。

是否有可能解决这个缓存问题(如果是缓存问题)?

4

2 回答 2

0

我认为您可以很好地应用上述修复程序。您添加的随机数只是一个永远不会被读取的 HTTP 属性。文件名保持不变,所以你应该没问题。

请参阅现有线程禁用某些图像的缓存

另请参阅同一链接中的第二个解决方案,提到

header("Pragma-directive: no-cache");
header("Cache-directive: no-cache");
header("Cache-control: no-cache");
header("Pragma: no-cache");
header("Expires: 0");
于 2013-07-24T13:35:54.740 回答
0

基于sashok_bg 的建议,我尝试再次应用这个广泛建议的修复。正如我在原始问题中所说,图像存储在 WEB-INF 目录中,无法通过带有 '' 标记的 JSP 页面访问。首先,我尝试通过操作请求 Dispatcher 尝试转发请求的位置来在 servlet 中应用修复。它没有工作...

然后我在运行时查看了 JSP 页面源代码,我发现是这样的:

<img style="-webkit-user-select: none" src="http://localhost:8084/simah/view?media=logo">

此标签与其他一些元素一起放置在元素内。这导致我将修复程序应用于 iframe 源本身。经过一番观察,问题似乎解决了。

<iframe src="<%="view?media=logo&time="+Calendar.getInstance().getTimeInMillis()%>" ></iframe>
于 2013-07-25T17:26:51.540 回答