2010-09-17 3 views
2

Je travaille sur un eshop avec une calculatrice pour calculer votre prêt. J'ai besoin d'un nouvel aperçu à ce sujet ... Imaginez cette situation:Problème de mise en cache du navigateur JS/AJAX

  1. L'utilisateur clique sur l'un des boutons pour faire une requête POST (jQuery) et remplir les données requises.
  2. utilisateur clique ajouter au panier et va au panier
  3. utilisateur clique bouton retour (navigateur)

page chargement, serveur remplit les données dans la calculatrice (par défaut), mais après c'est fait, le navigateur remplit les données JS du cache et une chose amusante arrive. Les données sont combinées et lorsque l'utilisateur ajoute le produit à son panier, il se trompe, mais le prix est valide. Une partie valide est ce que le serveur remplit et le reste vient du cache.

J'ai essayé d'utiliser les balises meta pour empêcher la mise en cache, j'ai dit jquery à pas cache la requête POST et même dans mon répondeur, j'ai plusieurs en-têtes qui disent - NE PAS CACHE. Pourtant, les données POST sont mises en cache et je n'ai aucune idée de comment l'éteindre ou le rafraîchir ou quoi que ce soit ... Quand je regarde les en-têtes qui reviennent avec les données json, l'en-tête expire est mis à l'année 2099, même même si j'ai dit que ce devrait être un an du passé. En dehors de cela, je ne sais vraiment pas ce qui pourrait causer ce problème.

Voici les en-têtes définis dans répondeur et ce qui ramène:

header("Expires: Mon, 26 Jul 1999 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Pragma: no-cache"); 
header("Content-type: text/x-json"); 

Cela revient (de Firebug):

Date   Fri, 17 Sep 2010 08:39:38 GMT 
    X-Powered-By PHP/5.1.6 
    Connection Keep-Alive 
    Content-Length 126 
    Pragma   no-cache 
    Last-Modified Fri, 17 Sep 2010 08:39:38GMT 
    Server   Apache 
    Content-Type text/x-json 
    Cache-Control no-cache, must-revalidate 
    Expires   Mon, 26 Jul 2099 05:00:00 GMT 

Remarque: lorsque je désactive le cache dans les préférences du navigateur, il fonctionne comme un charme.

Toutes les idées sont les bienvenues!

Edit:

J'ai essayé quelques heures fictives avant, mais cela ne le résoudre. Pour le dire tout le problème est que lorsque l'utilisateur clique sur le bouton de retour, la page wont actualiser, mais sa lecture à partir du cache, ou au moins les données qui viennent d'ajax sont mis en cache et sont remplis.

Donc, fondamentalement, j'ai besoin d'actualiser la page d'une manière intelligente lorsque l'utilisateur clique sur le bouton précédent. Notez que les cookies ne sont pas une option, parce que (peut-être un petit pourcentage, mais encore) certaines personnes n'ont pas de cookies autorisés.

+0

'header (" Expire le: lun, 26 juil 2099 05:00:00 GMT ");' cela me semble vraiment indiquer que vous définissez l'heure d'expiration exactement à ce que vous voyez dans Firebug, et vous ne le réglons pas à quelques années dans le passé. – Matt

+0

lol, vous aviez raison, mais il n'a toujours pas résolu mon problème. Quand j'ai cliqué en arrière les données étaient encore cachées ... – realshadow

Répondre

-3

Résolvez-le avec un petit hack, car il ressemble à un problème de navigateur pur.

+3

Si vous acceptez votre propre réponse, vous devez indiquer quelle a été votre solution. Votre question était assez spécifique, mais cette réponse est extrêmement générale et dépourvue de détails. – James

0

Ajoutez un paramètre fictif à toutes vos requêtes ajax '&t='+new Date().getTime(); Cela garantira qu'une nouvelle requête est envoyée à chaque fois.

+0

C'est l'une des choses que j'ai faites :) Mais cela ne marche pas aussi bien. Parce que tout le problème est quand appuyer sur le bouton de retour, je vais modifier ma question – realshadow

+0

Le problème pourrait se situer dans votre code JavaScript, vérifiez vos variables. –

1

Si vous voulez gérer les boutons Précédent/Suivant, vous pouvez utiliser le plugin bqq pour jQuery, qui est capable de modifier la # partie de l'URL.

Ainsi, vous serez en mesure de vous connecter à des événements back/forward et d'avoir un contrôle complet sur ce qui est exécuté et quand, en tirant toutes les demandes Ajax dont vous avez besoin.Cela signifie que vous devrez changer le concept de votre flux de pages - pas de publication directe sur le serveur, uniquement via ajax, + rendu côté client via un mécanisme de modèle.

Ceci est en quelque sorte une tendance émergente, des exemples étant google avec leur recherche instantanée.

Questions connexes