servlet请求的资源没有被缓存

时间:2016-01-04 13:07:06

标签: java servlets caching

我有一个可以通过浏览

访问的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连接后面,这可能会导致缓存拒绝。但是,我确定不是服务器拒绝此缓存,因为

  1. 正在缓存一些图片。
  2. 响应中没有设置标题(pregma,etag,cache-control ...)。
  3. google chrome会自动拒绝来自(某些)ssl连接的缓存吗?

2 个答案:

答案 0 :(得分:1)

servlet本身旨在以编程方式生成内容。因此,其通常所需的缓存行为不是缓存响应。但是,您可以通过添加如上所述的缓存控制标头来控制缓存行为,并在后续请求中提供304状态(如果存在所需的请求标头)。由于图像可以在不同内容的情况下动态创建,因此这不是缓存行为的良好指标。另见:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

在一个地方实现这一点的好方法是使用过滤器,参见例如

https://github.com/samaxes/javaee-cache-filter

答案 1 :(得分:0)

确保在您的回复中设置了以下标题,告诉浏览器相同的后续请求应缓存1天:

  • 缓存控制:public,max-age = 36000
  • 内容类型:image / jpeg
  • 日期:星期一, 2016年1月4日14:56:52 GMT
  • 到期日:2016年1月5日星期二00:56:52 GMT

您可以通过更改标题的值来更改缓存时间。

相关问题