我有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。我在这里做错了吗?
答案 0 :(得分:0)
我最终改变了我的代码。而不是使用webRequest.checkNotModified(eTag)
我手动检查我的资源(来自s3)的last-modified
和eTag
,并将其与请求标头中的if-modified-since
和if-none-match
进行比较。
此外,我还会在过滤器中移动与http缓存相关的所有内容。