Parece que se eu carregar conteúdo dinâmico usando $.get()
, o resultado será armazenado em cache no navegador.
Adicionar algumas seqüências aleatórias no QueryString parece resolver esse problema (eu uso new Date().toString()
), mas isso parece um hack.
Existe alguma outra maneira de conseguir isso? Ou, se a string única for a única maneira de conseguir isso, outras sugestões são new Date()
?
javascript
jquery
ajax
browser-cache
Salamander2007
fonte
fonte
$.now()
vez de fazer uma (nova Data (). GetTime ()) sempre.Respostas:
Eu uso
new Date().getTime()
, o que evitará colisões, a menos que você tenha várias solicitações acontecendo no mesmo milissegundo:Edit: Esta resposta tem vários anos. Ainda funciona (portanto, não o apaguei), mas existem maneiras melhores / mais limpas de conseguir isso agora . Minha preferência é por esse método, mas essa resposta também é útil se você deseja desativar o cache para cada solicitação durante a vida útil de uma página.
fonte
new Date().getTime()
código é utilizado como este ...var nocache = new Date().getTime(); var path = 'http://hostname.domain.tld/api/somejsonapi/?cache=' + nocache;
. Levei alguns minutos para descobrir isso sozinho. Obviamente,?cache
pode haver qualquer expressão que a API não queira.url = url + (-1 === url.indexOf('?') ? '?' : '&') + "__=" + Number(new Date());
A seguir, evitaremos que todas as solicitações futuras do AJAX sejam armazenadas em cache, independentemente do método jQuery que você usar ($ .get, $ .ajax, etc.)
fonte
O $ .get () do JQuery armazenará em cache os resultados. Ao invés de
você deve usar $ .ajax, que permitirá desativar o cache:
fonte
Todas as respostas aqui deixam uma pegada no URL solicitado, que aparecerá nos logs de acesso do servidor.
Eu precisava de uma solução baseada em cabeçalho sem efeito colateral e achei que isso pode ser alcançado configurando os cabeçalhos mencionados em Como controlar o cache de páginas da web em todos os navegadores? .
O resultado, trabalhando pelo menos no Chrome, seria:
fonte
outra maneira é não fornecer cabeçalhos de cache do lado do servidor no código que gera a resposta à chamada ajax:
fonte
Pessoalmente, sinto que o método da string de consulta é mais confiável do que tentar definir cabeçalhos no servidor - não há garantia de que um proxy ou navegador não apenas o armazene em cache de qualquer maneira (alguns navegadores são piores que outros - sem nome).
Geralmente uso,
Math.random()
mas não vejo nada de errado em usar a data (você não deve fazer solicitações AJAX com rapidez suficiente para obter o mesmo valor duas vezes).fonte
Seguindo a documentação: http://api.jquery.com/jquery.ajax/
você pode usar a
cache
propriedade com:fonte
É claro que as técnicas de "quebra de cache" farão o trabalho, mas isso não aconteceria em primeiro lugar se o servidor indicasse ao cliente que a resposta não deveria ser armazenada em cache. Em alguns casos, é benéfico armazenar em cache as respostas, outras vezes não. Deixe o servidor decidir o tempo de vida correto dos dados. Você pode alterá-lo mais tarde. Muito mais fácil de fazer no servidor do que em muitos lugares diferentes no seu código de interface do usuário.
Claro que isso não ajuda se você não tiver controle sobre o servidor.
fonte
Que tal usar uma solicitação POST em vez de uma GET ...? (O que você deveria mesmo assim ...)
fonte
A verdadeira questão é por que você precisa que isso não seja armazenado em cache. Se não deve ser armazenado em cache porque muda o tempo todo, o servidor deve especificar para não armazenar em cache o recurso. Se apenas mudar algumas vezes (porque um dos recursos dos quais depende pode mudar) e se o código do cliente tiver uma maneira de saber sobre ele, ele poderá anexar um parâmetro fictício ao URL que é calculado a partir de algum hash ou data da última modificação desses recursos (é o que fazemos nos recursos de script do Microsoft Ajax para que eles possam ser armazenados em cache para sempre, mas novas versões ainda podem ser exibidas conforme aparecem). Se o cliente não puder conhecer as alterações, a maneira correta deve ser para o servidor manipular solicitações HEAD corretamente e informar ao cliente se deve usar a versão em cache ou não. Parece-me que acrescentar um parâmetro aleatório ou dizer ao cliente para nunca armazenar em cache está errado porque a cache é uma propriedade do recurso do servidor e, portanto, deve ser decidido no lado do servidor. Outra pergunta a ser feita é se esse recurso realmente deve ser servido através do GET ou deve passar pelo POST? Essa é uma questão de semântica, mas também tem implicações de segurança (existem ataques que funcionam apenas se o servidor permitir o GET). O POST não será armazenado em cache.
fonte
Talvez você devesse olhar para $ .ajax () (se você estiver usando jQuery, com o que ele se parece). Dê uma olhada em: http://docs.jquery.com/Ajax/jQuery.ajax#options e a opção "cache".
Outra abordagem seria examinar como você armazena em cache as coisas no lado do servidor.
fonte
Uma pequena adição às excelentes respostas fornecidas: se você estiver executando uma solução de backup não-ajax para usuários sem javascript, terá que corrigir os cabeçalhos do lado do servidor de qualquer maneira. Isso não é impossível, embora eu entenda aqueles que desistem;)
Tenho certeza de que há outra pergunta no SO que fornecerá o conjunto completo de cabeçalhos apropriados. Não estou inteiramente convencido de que a resposta do mouse abrange todas as bases 100%.
fonte
Para aqueles que usam a
cache
opção do$.ajaxSetup()
Safari móvel, parece que você precisará usar um carimbo de data / hora para POSTs, pois o Safari móvel também armazena em cache. De acordo com a documentação em$.ajax()
(da qual você é direcionado$.ajaxSetup()
):Portanto, definir essa opção por si só não o ajudará no caso mencionado acima.
fonte
Basicamente, basta adicionar
cache:false;
no ajax, onde você acha que o conteúdo mudará à medida que o progresso avança. E o lugar onde o conteúdo não muda lá você pode omitir isso. Desta forma, você receberá a nova resposta semprefonte
Cache do Ajax do Internet Explorer: O que você fará sobre isso? sugere três abordagens:
fonte
Agora, é fácil fazer isso ativando / desativando a opção de cache em sua solicitação ajax, assim
fonte
Se você estiver usando o IE 9, precisará usar o seguinte na frente da sua definição de classe de controlador:
[OutputCache (NoStore = true, Duração = 0, VaryByParam = "*")]
classe pública TestController: Controller
Isso impedirá que o navegador faça cache.
Detalhes neste link: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
Na verdade, isso resolveu meu problema.
fonte
Como o @Athasach disse, de acordo com os documentos do jQuery,
$.ajaxSetup({cache:false})
não funcionará além de solicitações GET e HEAD.É melhor você enviar de volta um
Cache-Control: no-cache
cabeçalho do seu servidor de qualquer maneira. Ele fornece uma separação mais limpa das preocupações.Obviamente, isso não funcionaria para os URLs de serviço que você não pertence ao seu projeto. Nesse caso, considere fazer proxy do serviço de terceiros do código do servidor, em vez de chamá-lo do código do cliente.
fonte
Se você estiver usando o .net ASP MVC, desative o armazenamento em cache na ação do controlador adicionando o seguinte atributo à função de ponto final:
fonte
adicionar cabeçalho
fonte
anexar
Math.random()
ao URL da solicitaçãofonte