Eu mesmo consegui resolver. Achei este blog
http://ruturajv.wordpress.com/2005/12/27/conditional-get-request/
Aí está tudo exlicadinho (ou melhor … estaria, não fosso por um Caveat)
É só fazer assim na primeira resposta:
response.setDateHeader("Last-Modified", imageDetails.getLastModified());
response.setHeader("Cache-Control", "max-age=3600");
response.setHeader("Etag", image.getSha1Sum());
Mas a vida é uma cixinha de surpresas…
Veja o header:
Last-Modified: Wed, 01 Apr 2011 13:24:52 GMT
O tempo tem precisão máxima de segundos, mas o valor no imageDetailsl está em millisegundos…
aí, lá no debugador do eclipse estava assim:
imageDetails->lastModified : 1304113972554
headerIfNotModifiedValue : 1304113972000
Na hora de escrever
response.setDateHeader("Last-Modified", imageDetails.getLastModified());
O valor é arredondado para baixo.
Assim, devemos tratar esse dado da mesma forma que um float
Este pedaço de código não funciona:
if(imgDet.getHash().equals(ifNoneMatch) &&
imgDet.getLastModified() <= ifNotModSince
) {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
Faça assim:
if(imgDet.getHash().equals(ifNoneMatch) &&
imgDet.getLastModified() - ifNotModSince < 1000
) {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
Pronto! Em todas respostas seguintes, apenas um header com status 304 é enviado!