2016-02-26 2 views
6

Beim Abrufen des folgenden HTML in einem Browser wird ein Cache-Steuerelement-Header vom Browser für die XHTTP-Anforderungen im Hauptbereich festgelegt, aber nicht für die Anforderung aus dem Timeout-Rückruf. Dies führt dazu, dass die zweite Ressource immer aus dem Cache geladen wird, sofern kein Cache vorhanden ist. Warum beeinflusst die Anfrage in einem Callback die Cache-Header?Wie wirkt sich das Herstellen einer XMLHttpRequest-Nachricht aus einem Rückruf auf das Caching aus?

<!DOCTYPE HTML> 
<html> 
    <body> 
    <script type="text/javascript"> 

     var get = function (url) { 
     var xhttp = new XMLHttpRequest(); 
     xhttp.open("GET", url, true); 
     xhttp.send(); 
     } 

     get("resource1.html"); // Cache-control set 

     setTimeout(function() { 
     get("resource2.html"); // Cache-control not set 
     }, 10); 

     get("resource3.html"); // Cache-control set 

    </script> 
    </body> 
</html> 

(Ich habe dies die Maschinen auf allen getesteten und Browsern ich bei der Hand habe und die Ergebnisse sind recht konstant. Die einzige Ausnahme ist, dass Firefox einen Cache-control-Header für die Callback-Ressource zu setzen scheint, wenn die Timeout ist auf 0 eingestellt, was andere Browser immer noch nicht tun).

Antwort

-1

Kann jetzt nicht reproduzieren, aber lassen Sie uns zu Hause versuchen, in ...

ich getestet mit:

app.js

router.get(/resource./, function(req, res) { 
    res.setHeader('Cache-Control', 'public, max-age=90'); 
    res.send('<hr/>'); 
}); 
router.get('/', function(req, res) { 
    res.render('index'); 
}); 

index.html

<!DOCTYPE HTML> 
<html> 
<body> 
<script type="text/javascript"> 

    var get = function (url) { 
     var xhttp = new XMLHttpRequest(); 
     xhttp.open("GET", url, true); 
     xhttp.send(); 
    } 

    get("resource1.html"); // Cache-control set 

    setTimeout(function() { 
     get("resource2.html"); // Cache-control not set 
    }, 10); 

    get("resource3.html"); // Cache-control set 

</script> 
</body> 
</html> 

Sie alle bekommen 200er ...

enter image description here

und Cache-Control-

HTTP/1.1 200 OK 
X-Powered-By: Express 
Cache-Control: public, max-age=90 
Content-Type: text/html; charset=utf-8 
Content-Length: 5 
ETag: W/"5-mkFFtL4+3G6hWYdNAMJUPw" 
Date: Thu, 03 Mar 2016 16:09:48 GMT 
Connection: keep-alive 

Auch das Protokoll:

1.es Mal

Listening on port 3000 
GET/200 12.544 ms - 499 
/resource1.html undefined 
GET /resource1.html 200 1.389 ms - 5 
/resource3.html undefined 
GET /resource3.html 200 0.353 ms - 5 
/resource2.html undefined 
GET /resource2.html 200 0.233 ms - 5 

2.es Mal

GET/200 1.627 ms - 499 
/resource1.html no-cache 
GET /resource1.html 200 0.427 ms - 5 
/resource3.html no-cache 
GET /resource3.html 200 0.160 ms - 5 
/resource2.html no-cache 
GET /resource2.html 200 0.408 ms - 5 
+1

Ich frage nach den 'Cache-Control'-Headern, die in der Anfrage des Browsers eingestellt sind, nicht die Antwort des Servers. Wenn Sie 'console.log (req.path, req.headers [" cache-control "]);' zu Ihrem '/ resource.' '- Handler hinzufügen, den Browser-Cache löschen und neu laden, sollten Sie sehen, dass die Anforderung für' resource2.html hat keinen Cache-Control-Header. –

+0

Entschuldigung, wenn die Frage nicht eindeutig war. Ich habe den Text zur Klärung bearbeitet. –

+0

@IanMackinnon [aktualisiert] welchen Browser benutzen Sie? Hast du es im Inkognito-Modus versucht? – malix

Verwandte Themen