【问题标题】:Rails Render JSON - Session Lost?Rails 渲染 JSON - 会话丢失?
【发布时间】:2012-01-20 15:40:52
【问题描述】:

我正在尝试对响应 JSON 的控制器进行一些 Ajax 调用。

if session[:user]
  render :json => "Some Data"
else
  render :json => "You are not logged in"
end

第一次由经过身份验证的用户调用此操作时一切正常,session[:user]!= nil。 第二次调用它是nil

所以似乎 Rails 在我做render :json 时就失去了它的会话。我发现在第一个调用中,rails 用一个新的覆盖了*_session-cookie。因此,rails 不知道初始的、经过身份验证的会话。

如果我不将响应呈现为 JSON,一切正常。

如何强制 rails 在 JSON 渲染页面中设置与普通视图中相同的 sessionid?

【问题讨论】:

  • 尝试了多个关于此的教程 - 仍然是同一个问题

标签: ajax json session cookies


【解决方案1】:

经过六天的搜索,我终于找到了:

似乎由于缺少 X-CSRF-Token 标头,rails 破坏了会话。我现在将此标头添加到 JQuery 的 ajaxSend Hook 中:

$(document).ajaxSend(function(e, xhr, options) {
  var sid = $("meta[name='csrf-token']").attr("content");
  xhr.setRequestHeader("X-CSRF-Token", sid);
});

它现在按预期工作。

【讨论】:

    【解决方案2】:

    我把它放在 beforeSend 方法中:

    function goAjax(urlAddress,dataObject,successFunction,errorFunction){
            $.ajax({
                  type: "POST",
                  url: urlAddress,
                  beforeSend: function ( xhr ) {
                        xhr.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content'));
                  },
                  dataType: "json",
                  contentType: "application/json; charset=utf-8",
                  processData: false,
                  data: JSON.stringify(dataObject),
                  context: document.body,
                  success: function(data,status){ successFunction(data,status);},
                  error: function(data,status){ errorFunction()}
            });
        }
    

    如果您不需要使用其他方式的 ajax 请求,效果很好(这样您应该将 beforeSend 添加到所有 ajax 请求)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 2013-12-17
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2013-08-10
      • 2012-05-09
      相关资源
      最近更新 更多