2010-11-22 1 views
8

У меня есть страница в domain.com, которая делает запрос ajax JSONP (с использованием функции jQuery .getJSON()) URL-адресу в anotherdomain.com. Я подумал (считал: предположил), что ресурс в anotherdomain.com будет иметь серверный доступ к любым файлам cookie, установленным в этом домене, но это, похоже, не так?Доступ к файлам cookie через JSONP

Ajax-вызов выполняется специально для доступа к определенному файлу cookie, выполняет некоторые манипуляции с данными и возвращает богатый набор информации, определяемой значением cookie. У исходного домена нет прямого доступа к значению cookie, поэтому я подумал, что запрос ajax будет поддерживать состояние, в котором я нуждаюсь.

Какую важную часть информации о печенье я пропускаю? Я измучен, и я просто не вижу этого.

Спасибо.

UPDATE

Я нашел способ сделать это, но это выглядит как JSONP на мой взгляд, так что мне интересно, почему этот способ работает в то время как версия Ajax не делает. Запрос просто отключен от сеанса браузера, чтобы файлы cookie не были доступны?

<script type="application/x-javascript" src="<?php echo $service_url . '&callback=interests' ?>"></script> 
<script type="text/javascript"> 
    function interests(data) { 
    $(function() { 
     var c_behaviors = data.length; 
     var ids   = []; 

     for(var i = 0; i < c_behaviors; i++) { 
     ids.push(data[i].behavior_id); 
     } 

     $('body').append('<p><label>Returned:</label> ' + ids.join(', ') + '</p>');  
    }); 
    } 
</script> 
+1

Я уверен, что вы, возможно, втрое проверили это, но насколько вы уверены, что cookie был установлен другим доменом? Более того, каково состояние установленного файла cookie, например, истечение срока, путь и т. Д. – 2010-11-22 20:41:52

ответ

9

The same origin policy applies всем АЯКС запросов, поэтому если домен осуществляется доступ в вызов Ajax отличается от домена, загруженной в браузере (document.host), все куки, связанные с доменом в запрашиваемом URL не будет быть отправлен. Поэтому подход JSONP работает, потому что он выписывает новый тег сценария в окне, который будет вести себя как любой запрос ресурсов, который браузер может сделать для внешнего домена (следовательно, передача всех файлов cookie, связанных с доменом в URL-адресе). Я также подтвердил это, просто позвонив $.post("http://atdmt.com") с моей консоли Chrome, в то время как на stackoverflow.com в браузере (единственный другой домен, в котором были файлы cookie в моем браузере, при написании ответа), и он не отправил файлы cookie в запросить заголовки.

Другое решение, чтобы обойти проблему сохранения состояния для anotherdomain.com будет иметь anotherdomain.com установить первый участник печенье (не устанавливая атрибут домена куки) и когда Ajax/Запрос json делается на anotherdomain.com доступ к этим файлам cookie через javascript и подталкивает их запрос с использованием стандартных параметров HTTP.

Надеюсь, я помог.

1

Я столкнулся с той же проблемой раньше. Проблема, которую я обнаружил, заключается в том, что большинство браузеров не позволят вам ESTABLISH сеанса (т. Е. Установить cookie сеанса), когда одна и та же политика происхождения не выполняется.