【问题标题】:Cookies being passed when loading resource but not ajax?加载资源而不是ajax时传递cookies?
【发布时间】:2013-02-01 04:38:00
【问题描述】:

设置是我有一个 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>

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

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby ajax


    【解决方案1】:

    使用$.ajax,因为您需要发出JSONP 请求,因为您的ajax 调用是跨站点的。

    $.ajax({
      url: "xxxx",
      crossDomain : true,
      dataType    : 'json',//if response is in JSON Notation
      success     : function (result){
       alert(result);
      }
    });
    

    【讨论】:

    • 我之前尝试过,但这并没有解决我的问题。 cookie foo 仍未在请求中发送。在 Rails 方面,我添加了 headers['Access-Control-Allow-Origin'] = '*' 以允许请求跨域但 cookie[:foo] 仍然没有随请求一起发送。
    • 您的浏览器中是否有一些控制台,例如 Mozilla 中的 firebug,您可以从那里监控您的请求。
    【解决方案2】:

    正如技术人员所说,您需要使用 $.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参数

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2010-10-29
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多