Rails呈现JSON - 会话丢失?

时间:2011-12-14 21:10:56

标签: ajax json session cookies

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

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

第一次由authed用户调用此操作时,一切正常,session[:user]!= nil。 第二次被调用它是nil

所以看起来像我一样render :json就会失去它的会话。我发现在第一个调用rails中用一个新的覆盖*_session - cookie。因为rails不知道初始的,authed会话。

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

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

2 个答案:

答案 0 :(得分:9)

经过六天的搜索,我终于成功了:

似乎rails会因为缺少X-CSRF-Token标头而破坏会话。我现在在ajaxSend JQuery的Hook中添加此标题:

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

现在按预期工作了。

答案 1 :(得分:1)

我把它放在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请求),效果很好