测试 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);
发送条件 HTTP 请求时,通常只发送 If-Modified-Since
(使用 Last-Modified
值)和 If-None-Match
(使用 Etag
值)。
在这个例子中,你还发送了一个 max-age=0
指令,意思是“不要给我任何早于 0 秒的东西”,实际上是要求服务器发送响应(见 RFC doc about max-age).这通常是您在执行“硬刷新”时在浏览器请求中看到的那种指令。
从请求中删除该指令,服务器应响应 304 Not Modified。
我有启用 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);
发送条件 HTTP 请求时,通常只发送 If-Modified-Since
(使用 Last-Modified
值)和 If-None-Match
(使用 Etag
值)。
在这个例子中,你还发送了一个 max-age=0
指令,意思是“不要给我任何早于 0 秒的东西”,实际上是要求服务器发送响应(见 RFC doc about max-age).这通常是您在执行“硬刷新”时在浏览器请求中看到的那种指令。
从请求中删除该指令,服务器应响应 304 Not Modified。