一尘不染

通过JSONP的Cookie访问

ajax

我有一个页面,该页面向中的URL domain.com发出JSONP
ajax请求(使用jQuery的.getJSON()功能)anotherdomain.com。我以为(阅读:假定),其中的资源anotherdomain.com可以在服务器端访问该域中设置的任何cookie,但事实并非如此?

专门执行ajax调用以访问特定的cookie,进行一些数据操作并返回以cookie值为键的丰富信息集。原始域无法直接访问cookie值,因此我认为ajax请求将保持我需要的状态。

我会忽略关于Cookie的哪些关键信息?我精疲力尽,我只是看不到它。

谢谢。

更新

我找到了一种方法,但是在我看来,它看起来像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>

阅读 406

收藏
2020-07-26

共1个答案

一尘不染

相同的原始策略适用于所有ajax请求,因此,如果在ajax调用中访问的域与浏览器中加载的域(document.host)不同,则将不发送与请求url中的域关联的所有cookie
。因此,JSONP方法之所以有效,是因为它在窗口中写出了一个新的脚本标签,其行为就像浏览器可以向外部域发出的任何资源请求一样(因此,将与该域相关联的所有cookie传递给url)。我还通过$.post("http://atdmt.com")在浏览器中的stackoverflow.com上(仅在我的浏览器中有cookie的其他域中,同时写下答案的情况下)从Chrome控制台简单调用来确认这一点,并且在请求中未发送任何cookie标头。

另一种解决方案来解决保持状态的问题 **anotherdomain.com 将有 **anotherdomain.com
设置一个第一方Cookie(通过不设置cookie的域属性),当一个AJAX / JSON请求进行下列 **anotherdomain.com**
通过javascript访问这些cookie,并使用标准HTTP参数将其推送至请求。

希望我有所帮助。

2020-07-26