Springboot上的Httpcache

时间:2015-06-19 06:22:38

标签: spring-boot cache-control

我有springboot应用程序,它从url请求图像然后在浏览器上显示它。我想使用缓存控制头缓存我的响应。

我使用ResponseEntity并已使用eTag设置标头。我已在浏览器中检查了响应标题,并显示:

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

我的请求也有If-None-Match标题。但是,我总是获得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状态代码,即使我更改了网址。我通过webRequest.checkIsNotModified(...)eTag检查了last-modified,并且它始终返回true。我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

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

此外,我还会在过滤器中移动与http缓存相关的所有内容。