Потерпите меня, вам нужно немного объяснения.
Я помогаю построить гибридное мобильное веб-приложение. Основной кодовой базой является HTML5 и JavaScript, которые будут обернуты в собственный мобильный веб-просмотр (a la 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 для учета учетных данных пользователя, который включает файлы 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
и не может использовать wild carding.
Поэтому нам нужно изменить заголовки серверов, чтобы включить Access-Control-Allow-Credentials: true
и Access-Control-Allow-Origin
в наш Origin.
Здесь мы, наконец, приходим к моей проблеме: при загрузке веб-страницы с использованием протокола file://, заголовок запроса Origin
, отправленный из веб-представления, установлен на null
. Поэтому он не может быть проанализирован сервером, поэтому сервер не может установить его в Access-Control-Allow-Origin
. Но если сервер не может установить Access-Control-Allow-Origin
на нечто иное, чем *
, мы не можем отправлять учетные данные, включая файлы cookie.
Итак, я застрял. Что делать? Я видел аналогичный вопрос, размещенный здесь, но я не совсем понимаю предлагаемый ответ. Любая помощь приветствуется!