Терпите меня, это нужно немного объяснить.
Я помогаю создавать гибридное мобильное веб-приложение. Основная кодовая база - это HTML5 и JavaScript, которые будут обёрнуты в собственное мобильное веб-представление (как PhoneGap).
Часть функций требует, чтобы приложение отправляло информацию в веб-службу, контролируемую одним из наших клиентов. Существует очень мало возможностей изменить этот веб-сервис, поскольку он используется другими. Мы отправляем JSON с помощью HTTP POST и получаем ответы от сервера. Частью этого ответа является файл cookie JSESSIONID, который управляет нашей сессией с сервером. После первоначального вызова initSession()
нам необходимо отправлять файл cookie JSESSIONID с каждым (AJAX) запросом.
При развертывании на мобильном устройстве веб-приложение оборачивается в собственном веб-представлении, которое запускает веб-приложение, выбрав file:///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 есть специальный раздел для работы с учетными данными пользователя , который включает куки-файлы сеанса. Поэтому я изменил вызов 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
для нашего источника.
Здесь, наконец, мы подошли к моей проблеме: при загрузке веб-страницы с использованием файла: // protocol заголовок запроса Origin
, отправляемый из веб-представления, устанавливается на null
. Поэтому он не может быть проанализирован сервером, и поэтому сервер не может установить его в Access-Control-Allow-Origin
. Но если сервер не может установить для Access-Control-Allow-Origin
значение, отличное от *
, мы не сможем отправить учетные данные, включая файлы cookie.
Так что я застрял. Что делать? Я видел похожий вопрос, опубликованный здесь , но я не совсем понимаю предложенный ответ. Любая помощь приветствуется!