Ajax Rails呈现JSON-会话丢失?
我试图对一个用JSON响应的控制器进行一些Ajax调用Ajax Rails呈现JSON-会话丢失?,ajax,json,session,cookies,Ajax,Json,Session,Cookies,我试图对一个用JSON响应的控制器进行一些Ajax调用 if session[:user] render :json => "Some Data" else render :json => "You are not logged in" end 首次由授权用户调用此操作时,一切正常,会话[:user]为!=无。 它第二次被调用时是nil 所以我一做render:json,rails似乎就失去了它的会话。我发现在第一次调用中,rails会用一个新的cookie覆盖*\u会话。
if session[:user]
render :json => "Some Data"
else
render :json => "You are not logged in"
end
首次由授权用户调用此操作时,一切正常,会话[:user]
为!=无
。
它第二次被调用时是nil
所以我一做render:json
,rails似乎就失去了它的会话。我发现在第一次调用中,rails会用一个新的cookie覆盖*\u会话。因此,rails不知道初始的、经过授权的会话
如果我不将响应呈现为JSON,那么一切正常
如何强制rails在JSON呈现的页面中设置与普通视图相同的sessionid?经过六天的搜索,我终于做到了:
由于缺少X-CSRF-Token
头,rails似乎破坏了会话。现在,我正在JQuery的ajaxSend
钩子中添加此标题:
$(document).ajaxSend(function(e, xhr, options) {
var sid = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", sid);
});
它现在正在按预期工作。我把它放在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请求(这样您应该在发送到所有ajax请求之前添加),则效果非常好。尝试了多个关于此的教程-仍然是相同的问题