Nie można buforować obrazów obsługiwanych przez Spring MVC

Próbuję obsłużyć niektóre zasoby za pomocą kontrolera Spring MVC. Moje zasoby są zarządzane przez bazę danych i dlatego muszą być obsługiwane w ten sposób. Usługa wyszukuje metadane zasobu z bazy danych, odczytuje plik z systemu plików i buduje odpowiedź.

Oto jak wygląda mój kontroler.

@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);
    }
}

Wydaje się proste i proste? Można mieć nadzieję, że przeglądarka buforuje obrazy. Ale mimo próbowania wszystkich kombinacjiCache-Control, Expires, Last-Modified-On iETag, Nie odniosłem sukcesu.

Poniżej znajdują się nagłówki HTTP (usunięte nieistotne nagłówki) wypluwają się podczas dwóch kolejnych żądań.

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

Jednak gdy próbuję tej samej sekwencji (Ctrl + F5 dla pierwszego żądania i F5 dla kolejnych) na adresach URL, takich jak

http://www.google.co.uk/images/srpr/logo4w.png (Logo Google)http://fbstatic-a.akamaihd.net/rsrc.php/v2/yI/r/0PsXdTWc41M.png (Mobilny obraz Facebooka)

Widzę nagłówki takie jak te (pokazane dla adresu URL Facebooka), które wskazują, że przeglądarka przechowuje odpowiedź.

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

Uwagi:

Nie mam<mvc:resources /> Sekcja w mojej konfiguracji Spring, ponieważ robię dokładnie to samo w moim kontrolerze. Nawet dodanie tego nie ma znaczenia.Nie mamorg.springframework.web.servlet.mvc.WebContentInterceptor ponownie zdefiniowano w konfiguracji Spring z powyższych powodów. Próbowałem dodać jeden bez zysku.Próbowałem wszystkich metod opisanych whttps://developers.google.com/speed/docs/best-practices/caching.Mogę to powielić we wszystkich przeglądarkach.

questionAnswers(1)

yourAnswerToTheQuestion