javascript — AJAX POST запросы кэшируются

В моем веб-приложении я отправляю запрос POST на URL /navigate.php, Работает так, как должно.

Проблема в том, что это веб-приложение должно работать и в автономном режиме. Я должен отображать уведомление, когда запрос не может быть выполнен из-за проблем с подключением, и пользователь может снова выполнить синхронизацию, когда проблемы будут решены.

Когда я отключил свое интернет-соединение для целей отладки, я обнаружил, что запрос все еще возвращается с кодом состояния 200 каждый раз.

Я ошибаюсь, что POST-запрос не должен кэшироваться браузером?

После поиска по переполнению стека я попробовал решения, написанные здесь.

Я добавил кеш бюст (new Date().getTime()) на URL, но не было никаких изменений. Запросы все еще возвращались с 200.

Я попытался отправить следующие заголовки с сервера (PHP / Ubuntu):

header("Expires: Sat, 01 Jan 2005 00:00:00 GMT");
header("Last-Modified: ".gmdate( "D, d M Y H:i:s")."GMT");
header("Cache-Control: no-cache, no-store");
header("Pragma: no-cache");

Я не использую jQuery для AJAX (так как мне нужно было бы использовать его только для AJAX, больше ничего), иначе я бы использовал его cache вариант, и установите его в false, Но я предполагаю, что это делает то же самое, добавляет к URL-адресу кэш-память.

Я использую следующий код для отправки запроса:

define([],function(){

var a=[

function(){return new XMLHttpRequest()},
function(){return new ActiveXObject("Msxml2.XMLHTTP")},
function(){return new ActiveXObject("Msxml3.XMLHTTP")},
function(){return new ActiveXObject("Microsoft.XMLHTTP")}

];

var o=function(){

var r=false;

for(var i=0;i<a.length;i++) {

try{

r=a[i]();

} catch(e) {

continue;

}

break;

}

return r;

};

var verifyParam = function(param) {
if(typeof param === "undefined" || param === null) {
return false;
} else {
return true;
}
};

var checkParam = function(param,defaultValue) {
if(!verifyParam(param)) {
return defaultValue;
} else {
return param;
}
};

var generateCacheBust = function() {
return (new Date().getTime());
};

var request = function(url,method,dataInPost,initCallback,callback,error) {

var req = o();

if(!req) return false;

initCallback = checkParam(initCallback,function(){});

callback = checkParam(callback,function(){});

error = checkParam(error,function(){});

initCallback(req);

req.open(method,url,true);

if(dataInPost) {

req.setRequestHeader('Content-type','application/x-www-form-urlencoded');

}

req.onreadystatechange = function() {

if(req.readyState!=4) {

return;

}

try {

if(req.status!=200 && req.status!=304) {

error(req.status);

return;

} else {

callback(req);

}

} catch (e) {

error(req.status);

return;

}

}

if(req.readyState == 4) return;

try {

req.send(dataInPost);

} catch (e) {

error(req.status);

return;

}

};

var dataToString = function(data) {

var string = '';

for(var key in data) {

string += (encodeURIComponent(key)+'='+encodeURIComponent(data[key])+'&');

}

return string.substring(0,string.length-1);

}

var formattedResponse = function(req,type) {

var responseData = req.responseText;

if(type=="json") {

return JSON.parse(responseData);

} else {

return responseData;

}

}

var get = function(params) {

if(!verifyParam(params.url)) { return false; }

params.data = checkParam(params.data,{});

params.responseType = checkParam(params.responseType,'text');

params.init = checkParam(params.init,function(){});

params.success = checkParam(params.success,function(){});

params.error = checkParam(params.error,function(){});

params.cache = checkParam(params.cache,true);

if(!params.cache) {params.data.cacheBust = generateCacheBust();}

request(params.url+'?'+dataToString(params.data),"GET",false,params.init,function(req){

params.success(formattedResponse(req,params.responseType));

},params.error);

};

var post = function(params) {

if(!verifyParam(params.url)) { return false; }

params.data = checkParam(params.data,{});

params.responseType = checkParam(params.responseType,'text');

params.init = checkParam(params.init,function(){});

params.success = checkParam(params.success,function(){});

params.error = checkParam(params.error,function(){});

params.cache = checkParam(params.cache,true);

if(!params.cache) {params.url += "?" + "cacheBust=" + generateCacheBust();}

request(params.url,"POST",dataToString(params.data),params.init,function(req){

params.success(formattedResponse(req,params.responseType));

},params.error);

};

return {

get:get,

post:post

};

});

В сетевом журнале (Firefox) вот заголовки, показанные firebug

Заголовки запроса:

POST /explorer/ajax/navigate.php?cacheBust=1412147821832 HTTP/1.1
Host: genortal.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://genortal.com/dashboard.php
Content-Length: 12
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Заголовки ответа:

HTTP/1.1 200 OK
Date: Wed, 01 Oct 2014 07:17:01 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.3
Expires: Sat, 01 Jan 2005 00:00:00 GMT
Cache-Control: no-cache, no-store
Pragma: no-cache
Last-Modified: Wed, 01 Oct 2014 07:17:02GMT
Content-Length: 744
Keep-Alive: timeout=5, max=79
Connection: Keep-Alive
Content-Type: application/json

И вот заголовки, которые я получаю, когда я отключил интернет-соединение:

Заголовки запроса:

POST /explorer/ajax/navigate.php?cacheBust=1412148166275 HTTP/1.1
Host: genortal.com
Connection: keep-alive
Content-Length: 12
Cache-Control: no-cache
Pragma: no-cache
Origin: http://genortal.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-type: application/x-www-form-urlencoded
Accept: */*
Referer: http://genortal.com/dashboard.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

Заголовки ответа:

HTTP/1.1 200 OK
Date: Wed, 01 Oct 2014 07:22:46 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.3
Expires: Sat, 01 Jan 2005 00:00:00 GMT
Cache-Control: no-cache, no-store
Pragma: no-cache
Last-Modified: Wed, 01 Oct 2014 07:22:47GMT
Content-Length: 117
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/json

Серверный код:

<?php
/**
* Generation Portal
* Date: 24/9/14
* Time: 8:59 PM
*/

require_once '../../start_session.php';
require_once '../../libload.php';

use GenerationPortal\Genortal\Accounts\Session;
use GenerationPortal\Genortal\RequestIn;
use GenerationPortal\Genortal\ErrorDictionary\AjaxErrors;
use GenerationPortal\Genortal\AjaxHandler;
use GenerationPortal\Genortal\Explorer\Navigator;
use GenerationPortal\Genortal\Storage\DatabaseLayer;
use GenerationPortal\Genortal\FileSystem\FileSystem;

header("Expires: Sat, 01 Jan 2005 00:00:00 GMT");
header("Last-Modified: ".gmdate( "D, d M Y H:i:s")."GMT");
header("Cache-Control: no-cache, no-store");
header("Pragma: no-cache");

$requestIn = new RequestIn();

$ajaxHandler = new AjaxHandler();

if(!Session::loggedIn()) {

$ajaxHandler->error('not_signed_in',AjaxErrors::desc('not_signed_in'));

}

if(!$requestIn->paramSet('path')) {

$ajaxHandler->error('missing_parameters',AjaxErrors::desc('missing_parameters'));

}

$navigator = new Navigator();

try {

$databaseLayer = new DatabaseLayer();

$fileSystem = new FileSystem(Session::uid(),$requestIn->param('path'),$databaseLayer);

} catch (\Exception $e) {

$ajaxHandler->error('server_error',AjaxErrors::desc('server_error'));

}

$ajaxHandler->respond($navigator->parseDirectoryListing($fileSystem));

Кто-нибудь может предоставить быструю помощь в том, что здесь происходит? Это работа HTTP-кеширования?

3

Решение

Вы должны попытаться использовать очистку кэша для этой цели. Я имею в виду передать дополнительный параметр & это переменная с вашим URL-адресом что-то вроде этого

www.mydomain.com/navigate.php; //url without cache bust parameter
myRand=parseInt(Math.random()*99999999);
www.mydomain.com/navigate.php?rand=54321 //url with cache bust parameter

Так что в кеше выше ваш сервер будет понимать это как новый запрос.

3

Другие решения

Проблема была не с кодом, браузером или HTTP-кэшированием. Проблема была с моей операционной системой. Соединение не разрывалось даже после принудительного отключения. Я решил перезапустить мой рабочий стол.

Извиняюсь за то, что потратил немного вашего времени! Благодарю.

1

По вопросам рекламы [email protected]