Como incentivar (ou forçar) o browser a fazer "conditional get" e cache de imagens [RESOLVIDO]

Existe algum eito de “dizer” ao browser para dar cache em imagens e usar “conditional get”? Algum header…sei lá…
Assim, bastaria eu enviar um 304 e pronto.

PS: As imagens são armazenadas no banco de dados e são servidas por um servlet (e não tem outro jeito)…

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!