2012-01-14 1 views
47

У меня есть кросс-домен AJAX GET, который успешно запускается, но файлы cookie не привязаны к запросу GET. Когда пользователь нажимает кнопку входа в систему, выполняется POST для входа пользователя в систему, который работает правильно с перекрестным доменом. JavaScript является:Запрос CORS - почему печенье не отправлено?

 $.ajax(signin_url, { 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      data: JSON.stringify(credentials), 
      success: function(data, status, xhr) { 
       signInSuccess(); 
      }, 
      error: function(xhr, status, error) { 
       signInFailure(); 
      }, 
      beforeSend: function(xhr) { 
       xhr.withCredentials = true 
      } 
     }); 

заголовков ответа включает печенье:

Set-Cookie:user_token=snippysnipsnip; path=/; expires=Wed, 14-Jan-2032 16:16:49 GMT 

Если вход в преуспевает, запрос JavaScript GET сделан, чтобы получить подробную информацию текущего пользователя:

function signInSuccess() { 
    $.ajax(current_user_url, { 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     success: function(data, status, xhr) { 
      displayWelcomeMessage(); 
     }, 
     beforeSend: function(xhr) { 
      xhr.withCredentials = true; 
     } 
    }); 
} 

Заголовки, относящиеся к CORS, возвращенные из запроса ОПЦИИ Chrome:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow 
Access-Control-Allow-Methods:POST, GET, OPTIONS 
Access-Control-Allow-Origin:http://192.168.0.5 
Access-Control-Max-Age:1728000 

Тем не менее, никакие файлы cookie не отправляются по запросу GET.

ответ

65

Проблема была с JQuery звонки - кажется, так как 1.5 withCredentials должен быть определен как:

 $.ajax("http://localhost:3000/users/current", { 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      success: function(data, status, xhr) { 
       hideAllContent(); 
       $("#sign_out_menu_item").show(); 
       $("#sign_in_menu_item").hide(); 
       $("#welcome").text("Welcome " + data["username"] + "!"); 
       $("#welcome").show(); 
      }, 
      xhrFields: { 
       withCredentials: true 
      }, 
      crossDomain: true 
     }); 
+6

Провели 4 часа на получение этой работы. Хотел бы я видеть это сообщение раньше. Благодаря! – ChrisRich

+0

PUT/OPTIONS, похоже, не работает одинаково. Почему файлы cookie отправляются для GET/POST, но не для запроса PET prefllight OPTIONS? –

+2

Cookies не работают (не устанавливаются) на localhost. Вместо этого используйте ip-based domain (например, '127.0.0.1'), если вам нужно использовать файлы cookie локально. – Dziamid

 Смежные вопросы

  • Нет связанных вопросов^_^