Потерпите меня, это требует небольшого объяснения.
Я помогаю создавать гибридный мобильный телефон веб-приложение. Основная кодовая база - это HTML5 и JavaScript, которые будут заключены в собственное мобильное веб-представление (а-ля Phonegap).
Часть функциональности требует, чтобы приложение отправляло информацию в веб-службу, управляемую одним из наших клиентов. . Существует очень мало возможностей для изменения этой веб-службы, поскольку она используется другими. Мы отправляем JSON с помощью HTTP POST и получаем ответы от сервера. Частью этого ответа является файл cookie JSESSIONID, который управляет нашим сеансом с сервером. После при первоначальном вызове initSession ()
нам необходимо отправлять cookie JSESSIONID с каждым (AJAX) запросом.
При развертывании на мобильном устройстве веб-приложение обертывается во встроенном веб-представлении, которое запускает веб-приложение, просматривая файл: ///path/to/app/index.html
.
Первое, что мы попробовали, это попросить нашего клиента установить Access-Control-Allow-Origin: *
в заголовке ответа, чтобы разрешить CORS. Затем мы попытались отправить на сервер:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
Наблюдая за запросами, было очевидно, что файлы cookie не были включены. При ближайшем рассмотрении в спецификации CORS есть специальный раздел для работы с учетными данными пользователя , который включает файлы cookie сеанса. Поэтому я изменил вызов AJAX, включив в него следующее:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
Еще одна ошибка, на этот раз из браузера. Дополнительное чтение дало следующее:
Если сторонний сервер не ответил заголовком
Access-Control-Allow-Credentials: true
, ответ будет проигнорирован и не станет доступным для веб-содержимого.Важное примечание: при ответе на запрос с учетными данными сервер должен указать домен в заголовке
Access-Control-Allow-Origin
и не может использовать подстановочные знаки.
Итак, нам нужно изменить заголовки сервера, чтобы включить Access-Control-Allow-Credentials: true
и Access-Control-Allow-Origin
в наш источник.
Здесь мы наконец подходим к моей проблеме: при загрузке веб-страницы с использованием протокола file: // заголовок запроса Origin
, отправленный из веб-представления, устанавливается на null
. Следовательно, он не может быть проанализирован сервером, и поэтому сервер не может установить его в Access-Control-Allow-Origin
.Но если сервер не может установить для Access-Control-Allow-Origin
значение, отличное от *
, мы не сможем отправить учетные данные, включая файлы cookie.
Итак, я застрял. Что делать? Я видел похожий вопрос, размещенный здесь , но я не совсем понимаю предложенный ответ. Любая помощь приветствуется!