Java 为什么SpringMVC对http缓存控制的支持较差?

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

阅读这本书,更好地理解基于缓存的web横向扩展。但是当我尝试在我的Spring Boot项目中添加http缓存控制时,我发现缓存控制没有什么特别之处。我得到的唯一资源是:javadoc。ETag最有用的文章是

这让我很困惑。。。如果缓存控制真的很好,为什么找不到对Etag生成和缓存控制资源的支持?或者这不是目前最好的做法

现在,我的实现如下所示:

@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如何知道该有效负载的版本呢?