0

设置是我有一个 Rails 应用程序设置作为 JSON API 和另一个我想用来调用 API 的静态 html 页面。为了争论,rails API 位于 foo.com,静态 html 页面位于 bar.com。

在 foo.com 应用程序上,我有这样的东西:

    if !cookies[:foo]
      cookies[:foo] = "testing #{rand(500)}"
    else
      logger.info(cookies[:foo])

    render :json => { :cookie => cookies[:foo] }

当我尝试使用来自 bar.com 的 jquery 执行 ajax GET 请求时,cookie 不会被发送回 JSON API。

    $.get('http://foo.com/', function(data){console.log(data)})

但是,如果我将页面加载为资源,我可以让 cookie 在 foo.com 和 bar.com 之间来回发送

    <script type="text/javascript" src="http://foo.com"></script>

有谁知道为什么我能够在将脚本作为脚本资源加载时而不是在我执行简单的 ajax 请求时跨域来回传递 cookie?有什么办法吗?

4

2 回答 2

2

$.ajax根据需要使用,因为您JSONP的 ajax 调用是跨站点的。

$.ajax({
  url: "xxxx",
  crossDomain : true,
  dataType    : 'json',//if response is in JSON Notation
  success     : function (result){
   alert(result);
  }
});
于 2012-11-20T06:24:03.457 回答
0

正如技术人员所说,您需要使用 $.ajax 并发出 json(p) 请求才能启用跨域。

不过,这种实现方式的 Cookie 很棘手。即使您设法使用某种黑客来来回发送cookie,旧的(或更便宜的)浏览器也会阻止它们。

*咳嗽* IE *咳嗽*

解决此问题的一种简单方法是在 url 中传递 cookie,如下所示:

$.ajax({
  url: "//domain.com/path/to/stuff;cookie1=value1?someParameter2=value2",
  crossDomain : true,
  dataType    : 'json',//if response is in JSON Notation
  success     : function (result){
   alert(result);
  }
});

在这个例子中,我告诉我的服务器我的请求有一个值为“value1”的cookie名称“cookie1”和一个值为“value2”的GET参数

希望这可以帮助。

于 2013-01-31T20:38:00.487 回答