У меня есть приложение springboot, которое запрашивает изображение с URL-адреса, а затем отображает его в браузере. Я хочу кэшировать свой ответ, используя заголовок управления кешем.Httpcache on springboot
Я использую 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);
}
Может кто-нибудь мне помочь?
UPDATE
Я попытался с помощью метода, описанного в 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-адрес. Я проверил webRequest.checkIsNotModified(...)
либо eTag
, и last-modified
, и он всегда возвращает true. Я сделал что-то не так?
Этот вопрос уже отправлен http://stackoverflow.com/questions/28516853/how-to-add-cache-control-headers-to-image-served-by-spring-mvc –
thanks @NitinArora Я уже пробовал используя метод, описанный здесь http://stackoverflow.com/questions/17821518/unable-to-cache-images-served-by-spring-mvc, но 'webRequest.checkNotModified (...)' всегда возвращает true, либо используя ' eTag' или 'lastModified'. Вы можете мне помочь? – afik
Если вы, ваш образ всегда статичны, то мы пытаемся его обслуживать динамически? Используйте статические ресурсы для обслуживания изображений. Вот ссылка http://docs.spring.io/spring-framework/docs/4.1.4.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-static-resources –