negociação de conteúdo ignorado quando usando o navegador botão Voltar
-
13-09-2019 - |
Pergunta
Aqui está a situação:
Eu tenho uma aplicação web que a resposta a um pedido de uma lista de recursos, vamos dizer:
/items
Esta é inicialmente solicitada diretamente pelo navegador da web, navegando para esse caminho. Os usos do navegador É padrão "Aceitar" cabeçalho que inclui "text / html" e meu aplicativo percebe isso e retorna o conteúdo HTML para a lista de item.
Dentro do HTML retornado é algum JavaScript (jQuery), que, em seguida, faz uma solicitação ajax para recuperar os dados reais:
/items
Só que desta vez, o "Aceitar" cabeçalho é explicitamente definido como "application / json". Mais uma vez, o meu pedido percebe isso e JSON está corretamente retornou ao pedido, os dados são inseridos na página, e tudo é feliz.
Aqui vem o problema : Os navega utilizador para outra página, e depois pressionar o botão BACK. Eles são, então, solicitado a salvar um arquivo. Este acaba por ser o JSON de dados da lista de item.
Até agora eu confirmou que isso aconteça no Google Chrome e Firefox 3.5.
Há dois tipos possíveis de respostas aqui:
-
Como posso corrigir o problema. É Existe alguma combinação mágica de cabeçalhos cache-controlo ou outras vodu que causam o navegador para fazer a coisa certa aqui?
-
Se você acha que eu estou fazendo algo horrivelmente errado aqui, como devo ir sobre isso? Eu estou procurando exatidão, mas também tentando não sacrificar flexibilidade.
Se isso ajuda, a aplicação é uma aplicação web JAX-RS, usando Restlet 2.0m4. Eu posso fornecer cabeçalhos de pedido / resposta de amostra se é útil, mas eu acredito que a questão é completamente reproduzível.
Solução
Existe alguma combinação mágica de cabeçalhos Cache-controle ou outro vodu que causam o navegador para fazer a coisa certa aqui?
Se você servir diferentes respostas para diferentes Accept: cabeçalhos, você deve incluir o cabeçalho:
Vary: Accept
em sua resposta. O Vary cabeçalho também deve conter quaisquer outros cabeçalhos de solicitação que influenciar a resposta, por exemplo, se você fizer gzip / deflate compressão você teria que incluir Accept-Encoding.
IE, infelizmente lida com muitos valores de Vary
mal, quebrando cacheing completamente, o que pode ou não importa para você.
Se você acha que eu estou fazendo algo terrivelmente errado aqui, como devo fazer isso?
Eu não acho que a idéia de servir conteúdo diferente para diferentes tipos ao mesmo URL é terrivelmente errado, mas você está deixando-se para mais problemas de compatibilidade do que você realmente precisa. Baseando-se em cabeçalhos de trabalho através de JSON não é realmente uma ótima idéia na prática; você seria melhor fora de apenas ter um URL diferente, como /items/json
ou /items?format=json
.
Outras dicas
Eu sei que esta questão é antiga, mas apenas no caso de alguém corre para o seguinte:
Eu estava tendo esse mesmo problema com uma aplicação Rails usando jQuery, e eu fixa-lo, dizendo o navegador não para armazenar em cache a resposta JSON com a solução dada aqui a uma pergunta diferente:
jQuery $. getJSON funciona apenas uma vez para cada controle. não alcança o servidor novamente
O problema só pareceu ocorrer com o Chrome e Firefox. Safari estava lidando com o comportamento de volta tudo bem sem ter explicitamente a dizer-lhe para não cache.
velha questão, mas para qualquer outra pessoa vendo isso, não há nada de errado com o uso do questionador do cabeçalho Accept.
Este é um bug confirmado no Chrome. (Anteriormente também no Firefox, mas desde fixo.)
http://code.google.com/p/chromium/ problemas / detalhes? id = 94369