【问题标题】:Testing Spring HTTP Caching测试 Spring HTTP 缓存
【发布时间】:2015-06-23 07:12:14
【问题描述】:

我有启用 http 缓存的 springboot 应用程序。我正在使用webRequest.checkModifiedSince,如here 中所述。在浏览器中运行我的应用程序时,我得到正确的结果,200 第一次点击状态码和304 下一次点击。但是当我对我的应用程序运行 maven 测试时,webRequest.checkModifiedSince 似乎总是返回 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());
}

我在这里做错了吗?

【问题讨论】:

    标签: spring testing http-caching


    【解决方案1】:

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

    在此示例中,您还发送了一个 max-age=0 指令,这意味着“不要给我任何超过 0 秒的内容”,实际上是要求服务器发送响应(请参阅 RFC doc about max-age)。这通常是您在执行“硬刷新”时在浏览器请求中看到的那种指令。

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

    【讨论】:

      【解决方案2】:

      Last-Modified 标头是一个字符串,例如: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?

      【讨论】:

      • 谢谢@Ralph。但是当我打印res.getResponse().getHeader("Last-Modified") 它给了我Long (1434603287000)。这就是我使用 Long.parse 的原因。我没有得到任何异常,但webRequest.checkModifiedSince 在 mvn 测试中总是返回 false。您还有其他解决方案吗?
      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2021-11-17
      • 2020-12-04
      • 2014-11-07
      • 1970-01-01
      • 2016-08-10
      • 2017-07-30
      • 1970-01-01
      相关资源
      最近更新 更多