java - Servlet 请求的资源不会被缓存

标签 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 的文件并通过将这些字节写入响应来提供服务,同时还将内容类型 header 添加到响应中(以便浏览器知道它正在接收哪种文件)。

我想我可能需要添加额外的 header 来向浏览器解释应该缓存此内容。可以Cache-control标题在这里帮助我吗?然而,我认为浏览器足够聪明,可以缓存请求,无论我(不)使用什么 header 。

以下是成功缓存的图像的响应 header (通过 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. 响应中没有设置 header (pregma、etag、缓存控制...)。

Google Chrome 是否会自动拒绝(某些)ssl 连接的缓存?

最佳答案

Servlet 本身旨在以编程方式生成内容。因此,它通常期望的缓存行为不是缓存响应。但是,您可以通过添加您提到的缓存控制 header 来控制缓存行为,并在后续请求中提供 304 状态(如果存在所需的请求 header )。由于可以动态创建具有不同内容的图像,因此这并不是缓存行为的良好指标。另请参阅:

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

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

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

关于java - Servlet 请求的资源不会被缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34591900/

相关文章:

java - 我在 java 上遇到 SQL 语法错误,但没有任何错误

java - 对象生命周期记录

java - 当带有数据的 POST 请求到达 Java Servlet 时读取 URL 参数

ruby-on-rails - Redis 大量DEL+SET 时如何处理路由超时?

ruby-on-rails - Varnishd 是用于 Rails 的正确缓存解决方案吗?

java - 在父类中记录静态方法

java - 通过 JTS 中的并集组合 WKT 几何形状

java - 无法在 Struts 中加载配置

java - 在构建/打包/部署时禁用 servlet,在运行时启用?

c - 是什么导致Linux内核中的缓冲区膨胀?