Java 为什么SpringMVC对http缓存控制的支持较差?
阅读这本书,更好地理解基于缓存的web横向扩展。但是当我尝试在我的Spring Boot项目中添加http缓存控制时,我发现缓存控制没有什么特别之处。我得到的唯一资源是:javadoc。ETag最有用的文章是 这让我很困惑。。。如果缓存控制真的很好,为什么找不到对Etag生成和缓存控制资源的支持?或者这不是目前最好的做法 现在,我的实现如下所示:Java 为什么SpringMVC对http缓存控制的支持较差?,java,spring,spring-mvc,spring-boot,cache-control,Java,Spring,Spring Mvc,Spring Boot,Cache Control,阅读这本书,更好地理解基于缓存的web横向扩展。但是当我尝试在我的Spring Boot项目中添加http缓存控制时,我发现缓存控制没有什么特别之处。我得到的唯一资源是:javadoc。ETag最有用的文章是 这让我很困惑。。。如果缓存控制真的很好,为什么找不到对Etag生成和缓存控制资源的支持?或者这不是目前最好的做法 现在,我的实现如下所示: @RestController public class Api { @GetMapping("/with-cache") publ
@RestController
public class Api {
@GetMapping("/with-cache")
public ResponseEntity cache() throws InterruptedException {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setCacheControl("max-age=3600");
httpHeaders.setETag("\"3Rstthw\"");
Thread.sleep(1000);
return new ResponseEntity<>("Hello", httpHeaders, HttpStatus.OK);
}
}
@RestController
公共类Api{
@GetMapping(“/带缓存”)
public ResponseEntity cache()引发InterruptedException{
HttpHeaders HttpHeaders=新的HttpHeaders();
httpHeaders.setCacheControl(“max age=3600”);
httpHeaders.setETag(“\'3Rstthw\”);
睡眠(1000);
返回新的响应状态(“Hello”,httpHeaders,HttpStatus.OK);
}
}
看起来不太优雅。希望有人能对此给出答案。注释,但决定反对,因此您将不得不以某种方式手动处理它(但不一定像代码中那样)
决定反对的主要原因是,响应很复杂,可能存在重定向等问题,因此注释不适合
引述最后的评论
这里提到的特定用例是缓存控制。注意,在
4.1我们添加了ResponseEntity构建器,并在4.2中添加了与ResponseEntity构建器一起工作的CacheControl构建器
通过编程实现这一点非常方便,并且具有一些
与eTags和lastModified(一种
自动检查+304)。我们还具体考虑并决定
针对@CacheControl标头,因为这是一个横切要求。
相反,WebContentInterceptor可用于配置缓存
每个URL模式的设置,并接受CacheControl builder作为
嗯
注释,但决定不使用,因此您必须以某种方式手动处理它(但不一定像代码中那样)
决定反对的主要原因是,响应很复杂,可能存在重定向等问题,因此注释不适合
引述最后的评论
这里提到的特定用例是缓存控制。注意,在
4.1我们添加了ResponseEntity构建器,并在4.2中添加了与ResponseEntity构建器一起工作的CacheControl构建器
通过编程实现这一点非常方便,并且具有一些
与eTags和lastModified(一种
自动检查+304)。我们还具体考虑并决定
针对@CacheControl标头,因为这是一个横切要求。
相反,WebContentInterceptor可用于配置缓存
每个URL模式的设置,并接受CacheControl builder作为
嗯
“为什么”重要吗?请注意,这是一个问答网站,而不是一个讨论板。您认为“更好”的支持是什么?--请注意,ETag不是“生成的”。它们表示所讨论的资源的版本。例如:ETag是一个不透明的标识符,由web服务器分配给在URL上找到的资源的特定版本。如果该URL上的资源表示形式发生更改,则会分配一个新的不同ETag。既然Spring不知道响应的有效载荷来自何处,Spring如何知道该有效载荷的版本?这与“为什么”重要吗?请注意,这是一个问答网站,而不是一个讨论板。您认为“更好”的支持是什么?--请注意,ETag不是“生成的”。它们表示所讨论的资源的版本。例如:ETag是一个不透明的标识符,由web服务器分配给在URL上找到的资源的特定版本。如果该URL上的资源表示形式发生更改,则会分配一个新的不同ETag。既然Spring不知道响应的有效负载来自何处,那么Spring如何知道该有效负载的版本呢?