2012-04-19 4 views
40

Я знаю, что это было задано раньше в различных формах, но я не могу обойти эту проблему. Я пробовал использовать jQuery и собственный JS API для выполнения Ajax-запросов.HTTP Cookies и запросы Ajax по HTTPS

Моя ситуация следующая (см прилагаемую схему):

  1. браузер делает запрос HTTP
  2. Сервер отвечает и устанавливает Persistent Cookie
  3. Browser делает HTTP запрос Ajax, Cookie есть хорошо
  4. Сервер отвечает как ожидалось, обновления Cookie
  5. Браузер делает запрос HTTPS Ajax, Cookie больше не существует (?!)
  6. сервер дает ответ «по умолчанию», так как нет Cookie (непреднамеренное поведение)

Перед кем начинает лекцию о кросс-доменных запросов позвольте мне несколько вещей:

  • Я знаю, что это междоменный запрос (другой протокол), и именно поэтому сервер устанавливает заголовок Access-Control-Allow-Origin в ответе (и я использую Chrome и Firefox, оба из которых поддерживают CORS)
  • То, что я также знаю, что HTTP-файл cookie должен управляться через HTTPS (см. here). ince host - тот же
  • (EDIT) Файл cookie правильно настроен для общего домена (например, .domain.ext), и не установлены флаги HttpOnly или Secure.

Итак, почему, почему, почему браузер не передает cookie при выполнении вызова HTTPS Ajax? Есть идеи? Я собираюсь потерять рассудок ...

 +-----------+ HTTP Request  +-----------+ 
    |Browser |+---------------->|Server  | 
    +-----------+     +-----------+ 

        HTTP Response 
        <----------------+ 
        Set-cookie 

        Ajax HTTP Req. 
        +----------------> 
        Cookie (OK) 

        HTTP Response 
        <----------------+ 
        Set-cookie (OK) 

        Ajax HTTPS Req. 
        +----------------> 
        No Cookie (!!!) 
+0

Захвата запрос HTTP дамп и проверить, если какие-либо из '' secure' и HTTP-только 'flags устанавливаются в инструкции' Set-Cookie'. Это, по крайней мере, было бы хорошим местом для начала. – dpq

+0

Также не установлены. – NeXuS

+0

http://stackoverflow.com/questions/5441836/jquery-cookie-values-not-maintained-while-moving-from-http-to-https похоже, что это преднамеренное ограничение. – dpq

ответ

66

Хорошо, нашел решение проблемы с печеньем.

См. XHR specs, jQuery docs и StackOverflow.

Решение для отправки файлов cookie при переключении протокола и/или субдомена заключается в том, чтобы установить свойство withCredentials на номер true.

E.g. (с использованием jQuery)

$.ajax({ 
    /* Setup the call */ 
    xhrFields: { 
    withCredentials: true 
    } 
}); 
+2

Awesome. Вы сами нашли ответ. Спасибо, что поделился. Так много сообщений, когда люди находят ответ и не разделяют. Kudos NeXuS. – FernandoZ

+0

К сожалению, я не смог заставить его работать, тем не менее ...: D – NeXuS

+0

спасибо, это сработало для меня через 2 дня, пытаясь понять, почему –

0

Документ.cookie и Ajax Запрос не содержит cookie. В противном случае ajax не может получить доступ к файлам cookie из файла document.cookie или заголовков ответов. Их можно контролировать только удаленным доменом.

Если вы впервые получили ответ, включая cookie с сервера ajax, с тех пор вы можете запросить связь ajax с файлом cookie на сервере.

В этом случае, вы пишете, например, как показано ниже кода (JQuery)

$.jajx({ 
     xhrFields : { 
      withCredentials : true 
     } 
    }); 

См this article и demo