2015-06-19 3 views
1

У меня есть приложение 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. Я сделал что-то не так?

+0

Этот вопрос уже отправлен http://stackoverflow.com/questions/28516853/how-to-add-cache-control-headers-to-image-served-by-spring-mvc –

+0

thanks @NitinArora Я уже пробовал используя метод, описанный здесь http://stackoverflow.com/questions/17821518/unable-to-cache-images-served-by-spring-mvc, но 'webRequest.checkNotModified (...)' всегда возвращает true, либо используя ' eTag' или 'lastModified'. Вы можете мне помочь? – afik

+0

Если вы, ваш образ всегда статичны, то мы пытаемся его обслуживать динамически? Используйте статические ресурсы для обслуживания изображений. Вот ссылка http://docs.spring.io/spring-framework/docs/4.1.4.RELEASE/spring-framework-reference/html/mvc.html#mvc-config-static-resources –

ответ

0

В результате я изменил свой код. Вместо того, чтобы использовать webRequest.checkNotModified(eTag), я вручную проверю last-modified и eTag с моего ресурса (который из s3) и сравните его с if-modified-since и if-none-match в заголовке запроса.

Кроме того, я также перемещаю все, что связано с кэшированием http в фильтре.

Смежные вопросы