Spring Boot 上的 Http 缓存

Httpcache on springboot

我有一个 springboot 应用程序,它从 url 请求图像,然后在浏览器上显示它。我想使用 cache-control header.

缓存我的响应

我使用 ResponseEntity 并且已经将我的 header 设置为 eTag。我已经在我的浏览器中检查了响应 header,它显示:

Cache-Control:"max-age=31536000, public"
Content-Type:"image/jpeg;charset=UTF-8"
Etag:"db577053a18fa88f62293fbf1bd4b1ee"

我的要求还有If-None-Matchheader。但是,我总是获得 200 状态而不是 304

这是我的代码

@RequestMapping(value = "/getimage", method=RequestMethod.GET)
public ResponseEntity<byte[]> getImage() throws Exception {
    String url = "www.example.com/image.jpeg";
    String eTag = getEtag(url);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(new MediaType("image", "jpeg"));
    headers.add("Cache-Control", "max-age=31536000, public");
    headers.add("ETag", eTag);

    URL imageUrl = new URL(url);
    InputStream is = imageUrl.openStream();
    BufferedImage imBuff = ImageIO.read(is);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(imBuff, "jpeg", baos);
    byte[] image = baos.toByteArray();

    return new ResponseEntity<byte[]>(image, headers, HttpStatus.OK);
}

谁能帮帮我?

更新

我尝试使用 Unable to cache images served by Spring MVC 中描述的方法,所以我的代码变成了:

@RequestMapping(value = "/getimage", method=RequestMethod.GET)
public ResponseEntity<byte[]> getImage() throws Exception {
    String url = "www.example.com/image.jpeg";
    String eTag = getEtag(url);

    URL imageUrl = new URL(url);
    HttpURLConnection httpCon = (HttpURLConnection)imageUrl.openConnection();
    long lastModified = httpCon.getLastModified();

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(new MediaType("image", "jpeg"));
    headers.add("Cache-Control", "max-age=31536000, public");
    headers.add("ETag", eTag);
    headers.add("Last-Modified", new Date(lastModified).toString());

    if (webRequest.checkNotModified(eTag)) {
        return null;
    }
    InputStream is = imageUrl.openStream();
    BufferedImage imBuff = ImageIO.read(is);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(imBuff, "jpeg", baos);
    byte[] image = baos.toByteArray();

    return new ResponseEntity<byte[]>(image, headers, HttpStatus.OK);
}

但现在我总是得到 304 状态代码,即使我更改了 url。我通过 eTaglast-modified 检查了 webRequest.checkIsNotModified(...),它总是 return 正确。我是不是做错了什么?

我最终更改了我的代码。我没有使用 webRequest.checkNotModified(eTag),而是从我的资源(来自 s3)中手动检查 last-modifiedeTag,并将其与请求 [=] 中的 if-modified-sinceif-none-match 进行比较19=].

此外,我还将所有与 http 缓存相关的内容都移到了过滤器中。