我有一个可以通过浏览
访问的html文件https://localhost:8080/contextRoot/home.html
这个html使用2张图片:
<img src="https://localhost:8080/contextRoot/image1.jpg">
<img src="https://localhost:8080/static/images/image2.jpg">
第一张图片打包在我的war文件中并加载正常。当我重新加载页面时,它从缓存中取出而不是重新下载。我在浏览器的开发者工具中看到了这一点。
第二张图片也可以正常加载,但每次请求页面时都会下载。它永远不会被缓存。它使用一个特殊的java servlet来处理我们称之为静态内容的内容:
<servlet>
<servlet-name>staticFileServlet</servlet-name>
<servlet-class>com.company.web.file.StaticFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>staticFileServlet</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
此servlet在计算机磁盘中搜索文件夹C://images/
以查找名为image1
的文件,并通过将这些字节写入响应来提供服务,同时还将内容类型标题指向响应(因此浏览器知道它正在接收哪种文件)。
我想我可能需要添加其他标头来解释浏览器应该缓存此内容。 Cache-control
标题可以帮助我吗?但是,我认为浏览器足够聪明,可以缓存请求,无论我(不要)使用什么标头。
以下是成功缓存的图像的响应标头(由war文件提供服务)
Accept-Ranges:bytes
Content-Length:354
Content-Type:image/gif
Date:Mon, 04 Jan 2016 09:43:42 GMT
ETag:W/"354-1449227028000"
Last-Modified:Fri, 04 Dec 2015 11:03:48 GMT
Server:Apache-Coyote/1.1
以下是servlet提供的图像示例,并且没有缓存:
Cache-Control:max-age:864000
Content-Type:image/jpeg
Date:Mon, 04 Jan 2016 13:59:04 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
编辑:我的文件位于SSL连接后面,这可能会导致缓存拒绝。但是,我确定不是服务器拒绝此缓存,因为
google chrome会自动拒绝来自(某些)ssl连接的缓存吗?
答案 0 :(得分:1)
servlet本身旨在以编程方式生成内容。因此,其通常所需的缓存行为不是缓存响应。但是,您可以通过添加如上所述的缓存控制标头来控制缓存行为,并在后续请求中提供304状态(如果存在所需的请求标头)。由于图像可以在不同内容的情况下动态创建,因此这不是缓存行为的良好指标。另见:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
在一个地方实现这一点的好方法是使用过滤器,参见例如
答案 1 :(得分:0)
确保在您的回复中设置了以下标题,告诉浏览器相同的后续请求应缓存1天:
您可以通过更改标题的值来更改缓存时间。