测试 Spring HTTP 缓存

Testing Spring HTTP Caching

我有启用 http 缓存的 springboot 应用程序。我正在使用 webRequest.checkModifiedSince,如 here 中所述。当 运行 在浏览器中连接我的应用程序时,我得到正确的结果,第一次点击时为 200 状态代码,下次点击时为 304。但是当我 运行 maven 测试我的应用程序时,似乎 webRequest.checkModifiedSince 总是 return false.

这是我的测试用例:

@Test
public void checkCache() throws Exception {
    MvcResult res = this.mockMvc.perform(get("/resource/to/cache.jpg"))
                        .andExpect(status().isOk())
                        .andReturn();

    String date = res.getResponse().getHeader("Last-Modified");
    HttpHeaders headers = new HttpHeaders();
    headers.setIfModifiedSince(Long.parseLong(date));
    headers.setCacheControl("max-age=0");

    this.mockMvc.perform(get("same/resource/as/above.jpg")
                .headers(headers))
                .andExpect(status().isNotModified());
}

我是不是做错了什么?

Last-Modified header 是一个字符串,如:Wed, 15 Nov 1995 04:58:08 GMT。所以我非常怀疑你能否将它们解析为 Long.

我认为您的测试失败是因为解析异常。

String dateString = res.getResponse().getHeader("Last-Modified");
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
Date date = format.parse(dateString);

@见:How to parse Date from HTTP Last-Modified header?

发送条件 HTTP 请求时,通常只发送 If-Modified-Since(使用 Last-Modified 值)和 If-None-Match(使用 Etag 值)。

在这个例子中,你还发送了一个 max-age=0 指令,意思是“不要给我任何早于 0 秒的东西”,实际上是要求服务器发送响应(见 RFC doc about max-age).这通常是您在执行“硬刷新”时在浏览器请求中看到的那种指令。

从请求中删除该指令,服务器应响应 304 Not Modified。