我有一个弹簧启动应用程序,其中我尝试为静态图像配置内容资源策略。我在application.properties文件中设置了此配置:
spring.resources.chain.cache=true
spring.resources.cache-period=31536000
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/images/**
这使我可以为包含md5hash的图像资源提供网址,如下所示:http://localhost:8080/images/thing-90e8e8d5ff75897cb6068187c460b0b1.png。
当我请求这个网址时,我会得到一个ETag标头,就像我期望ETag: "90e8e8d5ff75897cb6068187c460b0b1"
但是,当我发出包含If-None-Match: "90e8e8d5ff75897cb6068187c460b0b1"
的后续请求时,我得到的是200状态代码,而不是预期的304。
稍微调试一下Spring类,我发现对ServletWebRequest.validateIfNoneMatch(String etag)
的调用总是得到一个空etag。似乎ResourceHttpRequestHandler.handleRequest(request, response)
执行"未修改"在它调用setHeaders之前检查它是否为VersionedResource
并生成ETag。
我设法通过在https://github.com/bclozel/spring-resource-handling克隆并运行示例应用来重现这一点。您可以请求http://localhost:8080/config-b5c916e3804c81ccd8956ce0bfe79ab0.js,获取ETag: "b5c916e3804c81ccd8956ce0bfe79ab0"
并请求If-None-Match: "b5c916e3804c81ccd8956ce0bfe79ab0"
,但仍然可以获得200回复。