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-Match
header。但是,我总是获得 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。我通过 eTag
和 last-modified
检查了 webRequest.checkIsNotModified(...)
,它总是 return 正确。我是不是做错了什么?
我最终更改了我的代码。我没有使用 webRequest.checkNotModified(eTag)
,而是从我的资源(来自 s3)中手动检查 last-modified
和 eTag
,并将其与请求 [=] 中的 if-modified-since
和 if-none-match
进行比较19=].
此外,我还将所有与 http 缓存相关的内容都移到了过滤器中。
我有一个 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-Match
header。但是,我总是获得 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。我通过 eTag
和 last-modified
检查了 webRequest.checkIsNotModified(...)
,它总是 return 正确。我是不是做错了什么?
我最终更改了我的代码。我没有使用 webRequest.checkNotModified(eTag)
,而是从我的资源(来自 s3)中手动检查 last-modified
和 eTag
,并将其与请求 [=] 中的 if-modified-since
和 if-none-match
进行比较19=].
此外,我还将所有与 http 缓存相关的内容都移到了过滤器中。