Não é possível armazenar em cache as imagens veiculadas pelo Spring MVC

Eu estou tentando servir alguns ativos usando um controlador de Spring MVC. Meus ativos são gerenciados pelo banco de dados e, portanto, devem ser atendidos dessa maneira. O serviço procura os metadados do ativo do banco de dados, lê o arquivo do sistema de arquivos e cria a resposta.

Aqui está como meu controlador se parece.

@Controller
@RequestMapping("/assets")
public class AssetController {

    @Autowired
    private AssetService assetService;

    @RequestMapping("/{assetName:.+}")
    public ResponseEntity<byte[]> 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<byte[]>(assetService.toBytes(asset), headers, OK);
    }
}

Parece simples e direto o suficiente? Esperamos ver o navegador armazenando as imagens em cache. Mas apesar de tentar todas as combinações deCache-Control, Expires, Last-Modified-On eETagEu não tive sucesso.

Abaixo estão os cabeçalhos HTTP (cabeçalhos irrelevantes removidos) exibidos durante duas solicitações sucessivas.

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 <-- Why not 304 Not Modified?
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:23:03 GMT

No entanto, quando tento a mesma sequência (Ctrl + F5 para a primeira solicitação e F5 para as subsequentes) em URLs como

http://www.google.co.uk/images/srpr/logo4w.png (Logotipo do Google)http://fbstatic-a.akamaihd.net/rsrc.php/v2/yI/r/0PsXdTWc41M.png (Imagem móvel do Facebook)

Eu vejo os cabeçalhos como esses (mostrados para o URL do Facebook) que indicam que a resposta está sendo armazenada em cache pelo navegador.

GET /rsrc.php/v2/yI/r/0PsXdTWc41M.png HTTP/1.1
Host: fbstatic-a.akamaihd.net
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 200 OK
Content-Type: image/png
Last-Modified: Sat, 15 Jun 2013 00:48:42 GMT
Cache-Control: public, max-age=31535893
Expires: Wed, 23 Jul 2014 21:27:47 GMT
Date: Tue, 23 Jul 2013 21:29:34 GMT
----------------------------------------------------------

GET /rsrc.php/v2/yI/r/0PsXdTWc41M.png HTTP/1.1
Host: fbstatic-a.akamaihd.net
If-Modified-Since: Sat, 15 Jun 2013 00:48:42 GMT
Cache-Control: max-age=0

HTTP/1.1 304 Not Modified <-- Note this
Content-Type: image/png
Last-Modified: Sat, 15 Jun 2013 00:48:42 GMT
Cache-Control: public, max-age=31535892
Expires: Wed, 23 Jul 2014 21:27:47 GMT
Date: Tue, 23 Jul 2013 21:29:35 GMT

Notas:

Eu não tenho<mvc:resources /> seção na minha configuração de Primavera desde que eu estou fazendo exatamente o mesmo no meu controlador. Mesmo adicionando isso não faz qualquer diferença.Eu não tenhoorg.springframework.web.servlet.mvc.WebContentInterceptor definido na configuração Spring novamente pelas razões acima. Eu tentei adicionar um sem ganho.Eu tentei todos os métodos explicados emhttps://developers.google.com/speed/docs/best-practices/caching.Eu posso replicar isso em todos os navegadores.

questionAnswers(1)

yourAnswerToTheQuestion