javascript — PhoneGap CORS-запрос случайным образом приводит к исключению xmlhttprequest 101

У меня есть телефонное приложение, которое использует CORS для синхронизации данных с сервером, сервер настроен для разрешения междоменных запросов с использованием php:

header('Access-Control-Allow-Origin: *');

Я даже поместил файл .htaccess, чтобы сделать то же самое:

Header add Access-Control-Allow-Origin "*"

У меня есть функция JS для создания запроса на стороне клиента (мобильное приложение):

function createCORSRequest(method, url, asynchronous) {
// return a xml http request
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {

// Check if the XMLHttpRequest object has a "withCredentials" property.
// "withCredentials" only exists on XMLHTTPRequest2 objects.
xhr.open(method, url , asynchronous);
//xhr.setRequestHeader("pragma", "no-cache");
//xhr.setRequestHeader('cache-control', 'no-cache');

} else if (typeof XDomainRequest != "undefined") {

// Otherwise, check if XDomainRequest.
// XDomainRequest only exists in IE, and is IE's way of making CORS requests.
xhr = new XDomainRequest();
xhr.open(method, url);

} else {

// Otherwise, CORS is not supported by the browser.
xhr = null;

}
return xhr;
}

Это вызывается функцией, такой как:

corsLogin: function(loginemail, loginpwd, callback, resetToken) {
// login to external web service for cross domain requests
// returns a token that we can use to subsequent calls to
// web service as we don't maintain a session state with server.
console.log('app.corsLogin');
var url = app.base_url + 'login.php';
var xhrLogin = createCORSRequest('POST', url, false);

if (!xhrLogin) {
app.displayError('CORS not supported','Sync Error');
return false;
}

// fill in form with login details
var formData = new FormData();
if (!loginemail) {
// use login details we logged into app with
formData.append('loginemail',app.username);
formData.append('pwd',app.pwd);
}
else {
// trying a set of creds that we sent in
formData.append('loginemail',loginemail);
formData.append('pwd',loginpwd);
}if (!app.deviceuuid) {
app.deviceuuid = 'web.browser';
}
// not currently used as we changed licensing model to be user/company based
// rather than licensing users for a number of devices, we'll send this anyway
// as we might use this info later on
formData.append('deviceuuid',app.deviceuuid);

// may reset token prior to long operation like a data sync as the current token
// might end up expiring half way through and that would scupper you.
if (resetToken) {
console.log('Requesting reset token on server');
formData.append('resettoken','1');
}

// handle bad things
xhrLogin.onerror = onCORSError;
xhrLogin.ontimeout = onCORSTimeout;

// handle the good bit
xhrLogin.onload = function () {
var responseText = xhrLogin.responseText;
// if OK get token
if (responseText.indexOf("OK ")===0) {
app.token = responseText.substring(3);
if(callback) {
callback();
}
}
else {
// server may want to redirect you to a very special place
if (responseText.indexOf('Redirect:')===0) {
responseText = responseText.substr(9);
app.render.redirectScreen(responseText);
return false;
}
else {
app.displayError(responseText,'Server Login Error');
return false;
}
}

};
try {
/*
console.log('app.corsLogin.formData',formData,formData.toString());

for (var fdkey in formData) {
console.log('formdata',fdkey,formData[fdkey]);
}
*/
console.log('app.corsLogin: ' + url);
xhrLogin.send(formData);
}
catch (err) {
app.displayError(err.message + ' whilst logging in',err.name);
}

},

На моем тестовом сервере это сработало на 100% (читай: ноутбук), но при развертывании в реальной среде оно работает случайным образом. Похоже, что все подобные проблемы, которые я обнаружил, связаны с тем, что междоменный домен не включен, но в этом случае он включен.

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector