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:

  1. 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?

  2. 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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top