由浏览器缓存的servlet检索的图像

时间:2013-07-24 09:03:36

标签: java-ee servlets web-applications browser-cache

我有一个JSP页面,结构如下:

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

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

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

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

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

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

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

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

是否可以解决此缓存问题(如果是缓存问题)?

2 个答案:

答案 0 :(得分:0)

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

查看现有主题Disable cache for some images

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

header("Pragma-directive: no-cache");
header("Cache-directive: no-cache");
header("Cache-control: no-cache");
header("Pragma: no-cache");
header("Expires: 0");

答案 1 :(得分: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>