Невозможно кэшировать изображения, обслуживаемые Spring MVC
Я пытаюсь обслуживать некоторые активы с помощью контроллера Spring MVC. Мои активы управляются базой данных и должны обслуживаться таким образом. Служба ищет метаданные ресурса из базы данных, считывает файл из файловой системы и создает ответ.
Вот как выглядит мой контроллер.
@Controller
@RequestMapping("/assets")
public class AssetController {
@Autowired
private AssetService assetService;
@RequestMapping("/{assetName:.+}")
public ResponseEntity getAsset(@PathVariable("assetName") String assetName) throws FileNotFoundException, IOException {
Asset asset = assetService.findByName(assetName);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf(asset.getContentType()));
headers.setCacheControl("max-age=1209600");
headers.setLastModified(asset.getModifiedOn().getTime()); // always in the past
return new ResponseEntity(assetService.toBytes(asset), headers, OK);
}
}
Кажется простым и достаточно простым? Можно было бы надеяться увидеть браузер, кэширующий изображения. Но, несмотря на попытки всех комбинаций,Cache-Control
Expires
Last-Modified-On
а такжеETag
У меня не было успеха.
Ниже приведены заголовки HTTP (ненужные заголовки удалены), которые выпадают во время двух последовательных запросов.
GET /adarshr-web/assets/Acer.png HTTP/1.1
Host: localhost:8080
Pragma: no-cache
Cache-Control: no-cache
HTTP/1.1 200 OK
Cache-Control: max-age=1209600
Last-Modified: Sun, 21 Jul 2013 11:56:32 GMT
Content-Type: image/png
Date: Tue, 23 Jul 2013 21:22:58 GMT
----------------------------------------------------------
GET /adarshr-web/assets/Acer.png HTTP/1.1
Host: localhost:8080
If-Modified-Since: Sun, 21 Jul 2013 11:56:32 GMT
Cache-Control: max-age=0
HTTP/1.1 200 OK