如何在 Rails 的 JSON 响应中包含 cookie?

Posted

技术标签:

【中文标题】如何在 Rails 的 JSON 响应中包含 cookie?【英文标题】:How do I include cookies within a JSON response in Rails? 【发布时间】:2011-05-05 05:02:46 【问题描述】:

我正在制作一个基于 PhoneGap 的 iPhone 应用程序,它将连接到 Rails 后端。我正在使用 jQuery 创建对 Rails 服务器的 Ajax 请求。我已成功获得服务器响应,但在获取 cookie 和管理会话时遇到问题。

默认情况下,Rails 在响应 html 请求时会发送一个 Set-cookie 标头。当 Rails 向 Ajax 请求发送 JSON 响应时,这似乎不会发生。

有没有办法在向 Rails 服务器发出 Ajax 请求时发送 Set-cookie 标头?

这是我的 ApplicationController 中的内容(我正在使用 Devise 进行身份验证):

def sign_in_and_redirect(resource_or_scope, resource=nil)
scope      = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
respond_to do |format|
   format.html redirect_to stored_location_for(scope) || after_sign_in_path_for(resource) 
   format.json render :json =>  :success => true, :session_id => request.session_options[:id], :current_user => current_user 
end

这是我用来发出 Ajax 请求的 jQuery 函数

$('#user_submit').click(function()
    $.ajax(beforeSend: function(xhrObj) xhrObj.setRequestHeader("Accept","application/json");,
      type: 'POST',
      url: 'http://localhost:3000/users/sign_in',
      data: "'user':'remember_me':'0','password':'pass1word','email':'email@company.com'",
      contentType: "application/json",
      dataType: "application/json",
      complete: function(data, textStatus)
      
    );
 );

我还没有通过谷歌搜索得出明确的答案,所以希望你能提供帮助。我找到了这个,但觉得它没有太大帮助:

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/66751d8e54f2fee6

【问题讨论】:

【参考方案1】:

看起来 Rails 在响应 Ajax JSON 请求时确实会默认发送 Set-cookie 标头。问题是 Safari 不接受 cookie,因为它将其视为外部来源。要接受 cookie,您需要在本地 Safari 中测试基于 HTML 的 iPhone 应用程序时,将 Safari 中“接受 cookie”的安全首选项更改为“始终”。

据我所知,在 Phonegap 中,您可以通过以下几种方式执行此操作:

http://groups.google.com/group/phonegap/browse_thread/thread/3290c5ac4e05be69?fwc=1 http://***.com/questions/3709315

【讨论】:

【参考方案2】:

我遇到了同样的问题,我无法确认您在回答自己时所说的内容。当我使用 curl 执行两次请求时,第一次使用“Accept:text/html”,第二次使用“Accept:application/json”,在后一种情况下,服务器不会发送 Set-Cookie 标头。不幸的是,我还没有为此提出解决方案。

specification 说:

"如果用户代理支持 HTTP 状态 管理它应该坚持,丢弃 并发送 cookie(如在 Set-Cookie 和 Set-Cookie2 响应 标头,并在 Cookie 中发送 标头)视情况而定。”

由于本规范是候选推荐,它可能尚未在浏览器中一致地实施。因此服务器可能会省略设置 cookie,我不知道。

【讨论】:

以上是关于如何在 Rails 的 JSON 响应中包含 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中包含带有帖子的评论

Retrofit-2.0 - 解析在 xml 中包含 json 的响应

Rails 5/6:如何在 webpacker 中包含 JS 函数?

如何在 Rails 3.1 中包含供应商 js

如何在rails的where子句中包含if条件

如何在 Rails 6 项目中包含 jquery-ui?