Como faço para manter Tomcat implantado arquivos em um contexto de cache em um navegador?

StackOverflow https://stackoverflow.com/questions/1138399

Pergunta

Eu estou trabalhando em um aplicativo Java / Struts que usos Tomcat 6.0.10. É um aplicativo web típico que permite aos usuários editar algumas formas, e córregos PDFs. Caminho de volta, que acrescentou:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>GeneralRequests</web-resource-name>
        <url-pattern>/WR1/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Assim que qualquer uma das páginas non-streaming são forçados a https e não em cache (nós pensamos). Existe uma entrada de restrição separado para as páginas de streaming no sistema.

Em testes recentes em um IE6, estamos descobrindo que "às vezes" as páginas são cache, embora não tenha totalmente determinado quando. Bem como a bandeira CONFIDENCIAL, nós também costumava ter:

        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache,no-store,max-age=0");
        response.setDateHeader("Expires", 1);

Mas nós removemos estes porque parecia estar causando feias advertências re-posting no IE6 e pensamos que o transporte de garantia CONFIDENCIAL também incluiu todos os mecânicos apropriados para evitar o cache do navegador da página. Nós preferimos deixar a questão até Tomcat para fazer corretamente.

O que é o caminho "certo" para fazer essas coisas, por isso não vamos ter (como muitos) problemas no futuro?

Será que os nossos problemas de cache que está sendo causado por um erro específico no IE6? Ou apenas um determinado conjunto de lançamentos? Isto permite que acontecem em 7 e / ou 8?

UPDATE: Nós marcada, e Tomcat está enviando corretamente o Pragma, Cache-Control e Expira parâmetros, de modo que não é o problema (bem, os valores não-corda e max-idade não são sendo enviado, mas ainda não é o problema).

O problema acabou por ser o Apache Portable Runtime (APR) 1.1.8. De alguma forma, embora não somos inteiramente certo porque, ele está criando ações navegador duplicados de uma única solicitação. Para nós, parecia que a página foi armazenada em cache porque continha um inválido Struts Transação token, mas na realidade uma segunda versão do mesmo pedido (com o ID de sessão errado) execução foi substituindo o pedido de originais token na sessão. A atualização para 1.1.16 corrigiu o problema.

Por que alguns pedidos estavam sendo duplicados (mas com diferentes sessões ids) ainda é um mistério ...

Paul.

Foi útil?

Solução

No navegador deve armazenar em cache nenhum item que recebe através de SSL, por isso gostaria de inclinar-se para um bug no IE6. Você poderia tentar 0 ou -1 como o valor para Expira em vez de 1, mas tudo o que você está fazendo parece ok para mim.

response.setHeader("Expires", 0);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top