Сохранение файла cookie после запроса ajax для междоменного доступа

Приложение javascript, работающее на 10.0.0.1, пытается аутентифицировать его пользователями с помощью междоменных вызовов ajax.

Запрос выглядит так:

function test(again){
  $.ajax({
    type: 'GET',
    url: 'http://example.com/userinfo',
    dataType: 'json',
    success: function(userinfo){
      if(again)
        test(false);}});}
test(true);

Первый ответ сервера пытается установить cookie:

Access-control-allow-origin:http://10.0.0.1
Set-Cookie:PHPSESSID=uuj599r4k1ohp48f1poobil665; expires=Sat, 28-Jan-2012 17:10:40 GMT; path=/

Но второй запрос не включает этот файл cookie и другие запросы ajax в этот домен.

Я не пытаюсь прочитать cookie для другого домена, я просто хочу, чтобы приложение в другом домене могло устанавливать и читать его собственный файл cookie.

Возможно ли это?

Я тестировал в Chrome и Firefox 9.

Ответы

Ответ 1

сервер должен установить заголовок:

response.Headers.Add("Access-Control-Allow-Credentials", "true");

клиент настроен на:

xhrFields: {
  withCredentials: true
}

Ответ 2

Пока вы используете браузер, который поддерживает CORS, файлы cookie в запросе AJAX должны работать. Но вы должны установить withCredentials на XMLHttpRequest в значение true.

Смотрите: Атрибут withCredentials

Я не использую JQuery, но здесь задан вопрос, связанный с установкой withCredentials через JQuery.

Отправка учетных данных с междоменными сообщениями

Ответ 3

Нет, файлы cookie не могут быть разделены между доменами. та же самая политика происхождения может быть обойдена для вызовов AJAX, используя заголовки Access-Control-*, предполагая, что браузер поддерживает их, но для файлов cookie нет способа.

Ответ 4

+ Дарин Димитров подозревает, что "файл cookie не сохраняется браузером, потому что он исходит из другого домена, чем тот, который размещает страницу, которая находится в начале этого вызова".

Однако cookie устанавливается по желанию при использовании JSONP, но JSONP предназначен только для запросов GET.

Мое решение состоит в том, чтобы извлечь файл cookie (идентификатор сеанса PHP), загрузив следующий файл php в <script>:

<? echo $_GET['callback'] . '("' . session_id() . '")'; ?>

И передать идентификатор сеанса в качестве переменной запроса во всех междоменных POST-запросах.