Problema com Cache no Browser - [Cache-Control, Expires, Last-Modified, etc]

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

Tenta testar numa URL de verdade, sem ser localhost. Já vi navegadores não cachearem coisas porque era localhost.

PS. se não der pra subir online em algum canto, é só editar o arquivo hosts e colocar um endereço de mentira lá apontando pra 127.0.0.1.

Blz! Vou configurar o projeto em um servidor web pra testar…

valeu!!

Entao,

Eu joguei para um servidor de testes e mesmo assim o problema continua

Tenta acessar o link
http://www.dwbh.com.br/polares/teste.jsp

vc vai ver q o javascript “teste.js” sempre é carregado pelo browser (fiz de tal maneira q o conteudo dentro desse .js sempre mude)

valeu pela Ajuda!

No meu chrome aqui ta funcionando direitinho o cache. Acesso duas vezes a pagina e ele pega do cache. O valor no alert é o mesmo nos dois acessos.

Bom, entao eu acho q esta configurado corretamente. Mesmo limpando o cache do browser (IE, Firefox e Chorme) aqui na minha maquina nao ta guardando cache.
De qualquer forma nao deve ser problema na parte do servidor, talvez alguma configuracao do meu browser vou dar uma pesquisada sobre isso :slight_smile:

Em relação ao Filtro java que configura a data de expiracao dos arquivos eu achei bem simples de fazer no java, a principio não vi vantagem em deixar essa configuracao para o Web-Server já q eu ficaria dependente do servidor, ja colocando direto no Java parece q fica mais livre para fazer o deploy da aplicacao em qualquer servidor.
O q vc acham? Qual melhor maneira de criar o filtro para setar os dados de cache?

Acho ok o filtro setar os headers, fica facil de fazer mesmo.