Ola,
Eu tenho alguns arquivos javascript q eu gostaria q o browser fizesse cache deles, porém o browser mesmo recebendo a configuracao para nao requisitar novamente o arquivo javascript ele parece ignorar e sempre q atualizo a pagina ele chama novamente o arquivo.
Vou lista abaixo o q eu fiz para configurar o cache
Criei um filtro da seguinte maneira:
public synchronized void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
if (request.getServletPath().endsWith("/teste.js")) {
DateFormat httpDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
httpDateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Calendar agora = new GregorianCalendar();
response.setHeader("Last-Modified", httpDateFormat.format(agora.getTime()));
int TRINTA_DIAS_EM_SEGUNDOS = 60 * 60 * 24 * 30; // 30 dias
agora.add(Calendar.SECOND, TRINTA_DIAS_EM_SEGUNDOS);
response.setHeader("Cache-Control", "PUBLIC, max-age=" + TRINTA_DIAS_EM_SEGUNDOS + ", must-revalidate");
response.setHeader("Expires", httpDateFormat.format(agora.getTime()));
System.err.println("Carregou Javascript teste");
}
}
Ou seja, quando tiver alguma chamada para o javascript “/teste.js” ele informa ao browser q faça cache desse arquivo por 30 dias
Criei um arquivo JSP (“teste.jsp”):
<html>
<head>
<script type="text/javascript" src="<%= request.getContextPath() %>/teste.js" > </script>
</head>
<body>
Teste: <input type="button" value="Teste" onclick="testar()">
</body>
</html>
e o arquivo javascript “teste.js”:
function testar() {
alert('Teste 1 ');
}
Porém quando eu chamo a pagina “teste.jsp” ele sempre esta chamando no servidor o arquivo “teste.js”. Tanto é q se eu mudar o conteudo do arquivo javascript ele mostra atualizado.
Estou usando o Google Chorme (com ySlow e PageSpeed) para debugar e validar o html gerado. E no Chrome o Response para a requisicao do .js aparece da seguinte maneira:
Request URL:http://localhost:8080/bk/teste.js
Request Method:GET
Status Code:304 Not Modified
>>> Request Headers
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie:JSESSIONID=9143AE90A277B41E9F1006FCDABC76F1
Host:localhost:8080
If-Modified-Since:Mon, 26 Mar 2012 16:08:40 GMT
If-None-Match:W/"45-1332777161150"
Referer:http://localhost:8080/bk/teste.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11
>>> Response Headers
Cache-Control:PUBLIC, max-age=2592000, must-revalidate
Date:Mon, 26 Mar 2012 16:08:42 GMT
ETag:W/"45-1332777161150"
Expires:Wed, 25 Apr 2012 16:08:42 GMT
Last-Modified:Mon, 26 Mar 2012 16:08:42 GMT
Server:Apache-Coyote/1.1
Me parece q eu fiz tudo corretamente, e quem esta errado é o Chorme/IE/Firefox de estar toda hora chamando a pagina no servidor e ignorar a configuracao. Tanto q os proprios PageSpeed e ySlow mostram q a configuracao de Expiracao do .js esta correta, mesmo assim o browser sempre chama a pagina do servidor.
Alguem sabe o q pode estar acontecendo?
Valeu