当前位置: 首页 > 知识库问答 >
问题:

即使有Etag、max-age:0、must-revalidate和no-cache,更改的静态文件的URL仍然返回304

邵伟泽
2023-03-14

我正在尝试将Etag特性实现到我的Spring Boot应用程序中,这样浏览器就可以在服务器映像更改时更新映像缓存。

我通过一个YAML文件更改了Spring Boot设置:

spring:
  jackson:
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: false
  resources:
    static-locations: classpath:static/
    chain:
      strategy:
        content:
          enabled: true
    cache:
      cachecontrol:
        max-age: 0
        must-revalidate: true
        no-cache: true
  mvc:
    static-path-pattern: /resources/**
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Bean
    public ShallowEtagHeaderFilter shallowEtagHeaderFilter() {
        return new ShallowEtagHeaderFilter();
    }
}
GET /resources/image/product/list/foo.png HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7,vi;q=0.6
Cookie: _ga=GA1.1.134751806.1551948465; loginFlag=undefined; branchId=admin

HTTP/1.1 200
Last-Modified: Wed, 08 May 2019 05:17:32 GMT
Cache-Control: no-cache, must-revalidate
Accept-Ranges: bytes
ETag: "0b99ccc3070d4e65cd155b768a56f97e4"
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Content-Type: image/png
Content-Length: 101070
Date: Fri, 10 May 2019 08:03:37 GMT
GET /resources/image/product/list/foo.png HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7,vi;q=0.6
Cookie: _ga=GA1.1.134751806.1551948465; loginFlag=undefined; branchId=admin
If-None-Match: "0b99ccc3070d4e65cd155b768a56f97e4"
If-Modified-Since: Wed, 08 May 2019 05:17:32 GMT

HTTP/1.1 304
Last-Modified: Wed, 08 May 2019 05:17:32 GMT
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Date: Fri, 10 May 2019 08:05:32 GMT
GET /resources/image/product/list/foo.png HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7,vi;q=0.6
Cookie: _ga=GA1.1.134751806.1551948465; loginFlag=undefined; branchId=admin
If-None-Match: "0b99ccc3070d4e65cd155b768a56f97e4"
If-Modified-Since: Wed, 08 May 2019 05:17:32 GMT

HTTP/1.1 304
Last-Modified: Sun, 05 May 2019 19:08:52 GMT
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Date: Fri, 10 May 2019 08:09:32 GMT

共有1个答案

谭嘉歆
2023-03-14

看来设置没有问题。我没有通过IDE(IntelliJ IDEA)构建和运行项目,而是尝试了Gradlebootjar并运行了jar文件,结果它按预期工作。

 类似资料:
  • 来自RFC 2616 http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 与之相比 必须-重新验证 当缓存接收到的响应中存在必须重新验证指令时,该缓存在条目过期后不得使用该条目来响应后续请求,而不首先使用原始服务器重新验证该条目 特别是关于,用户代理实际上是这样根据经验对待这个指令的吗? 如果有和,有什么意义? 请参阅以

  • 我用的是Chrome40(所以一些漂亮和现代的东西)。 在所有页面上都设置了no-cache-所以我希望浏览器只在首先检查服务器并得到响应时才使用其缓存中的某些内容。 然而,在按下后退按钮时,浏览器会愉快地点击自己的缓存,而无需与服务器进行检查。 我认为我可以使用作为的一个轻量级替代方案,在这里我不希望用户通过后退按钮看到陈旧的数据(但是数据是无价值的,因此可以缓存)。 我对的理解是浏览器必须始终

  • 我想改变为任意 Java 程序调用 时会发生什么(我想将时间移回以帮助容器检查点/恢复用例)。每当调用System.nanoTime()时,我都想运行原始然后可能返回一个不同的值。我正在尝试使用字节伙伴和 JVM 仪表代理来执行此操作(根据此处和此处)。 这是我的尝试: 和 但这失败了: 有什么办法可以实现这一点?我试过的其他东西: 使用 而不是 然后在 nanoTime() 中调用 - 这似乎是

  • Access-Control-Max-Age响应 header 指示多长时间的结果预检请求(即包含在所述信息Access-Control-Allow-Methods和Access-Control-Allow-Headers的 headers )可以被缓存。 Header type Response header Forbidden header name no 语法 Access-Control-

  • 问题内容: 我在具有基本HTTP服务器(没有Express或Connect或类似的东西)的Node服务器上使用Socket.IO。默认情况下,Socket.IO将客户端文件提供给 /socket.io/socket.io.js 我希望能够将该基本路径更改为其他内容,例如 /foo/bar/socket.io/socket.io.js 是否有任何内置方法来执行此操作,或者是否有任何不更改Socket

  • 在一个示例演示应用程序中,我使用React Native进行网络调用。实际上,React Native使用和作为默认缓存策略。当进行网络调用时,服务返回的响应包含以下缓存控件标头: 基于14.9.4缓存重新验证和重新加载控制部分,这不应该是预期的行为,但也许我错了。 因为高速缓存可以被配置为忽略服务器的指定过期时间,并且因为客户端请求可以包括max-stale指令(具有类似的效果),所以该协议还包