Ruby on rails Rails-会话无法通过AJAX登录?
我有一个Rails应用程序,它使用静态html页面(不在app/views/中)向Rails服务器发送AJAX请求以进行登录和注销Ruby on rails Rails-会话无法通过AJAX登录?,ruby-on-rails,ajax,session,Ruby On Rails,Ajax,Session,我有一个Rails应用程序,它使用静态html页面(不在app/views/中)向Rails服务器发送AJAX请求以进行登录和注销 我使用session进行用户身份验证,当用户登录时,session[:userid]被设置,响应“logged-in”被发送回静态html页面。但是,在登录后,当我单击注销按钮时,我发现会话[:userid]变为nil 这是我的密码: 要登录,请执行以下操作: def login # code here if encrypt(params[:pa
我使用session进行用户身份验证,当用户登录时,
session[:userid]
被设置,响应“logged-in”被发送回静态html页面。但是,在登录后,当我单击注销按钮时,我发现会话[:userid]
变为nil
这是我的密码:
要登录,请执行以下操作:
def login
# code here
if encrypt(params[:password]) == @user.password # authenticated
session[:userid] = @user.id
render :text => 'logged in'
else # wrong password
render :text => 'password not correct'
end
end
用于注销
def logout
# here session is no longer available
session[:userid] = nil
render :text => 'logged out'
end
登录页面:
<button id='login_button'>Log in</button>
<script type="text/javascript" charset="utf-8">
$('#login_button').click(function() {
$.ajax({
type: 'POST',
url: 'http://localhost:3000/user/login',
data: { username : $('#login_username').val() , password : $('#login_password').val() }
}).done(function(data) {
if (data == 'logged in') {
window.location = 'logged_in.html';
} else {
alert(data);
}
});
});
</script>
注销日志:
Started POST "/user/logout" for 127.0.0.1 at 2012-10-12 16:28:50 -0500
Processing by UserController#logout as */*
{} <--------------------------------------- here I printed out session
Rendered text template (0.0ms)
Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.0ms)
于2012-10-12 16:28:50-0500为127.0.0.1开始发布“/用户/注销”
由UserController处理#注销为*/*
{}你们有“防伪”套装吗?如果是,这就是问题的根源。当Rails收到Ajax调用并且没有找到正确的CSRF令牌时,它将关闭会话
与其在全局范围内关闭保护,不如在相关控制器中放置类似的内容,仅对来自静态页面的任何调用关闭保护:
skip_before_filter :verify_authenticity_token, :only => [:login, :logout]
“当我单击注销按钮时,我发现会话[:userid]
变成了nil
”--这不是应该发生的吗?不,这不是Ajax的问题。您可以使用Ajax请求更新会话。@很抱歉,我的意思是在将会话[:userid]设置为nil之前,它已经是nil了。您可以详细说明如何从视图中调用注销函数。比如按钮或链接。我在这里看不到任何问题。只是添加了前端部分。谢谢。谢谢,但即使我删除了protect\u from\u forgery
它似乎也能工作。您可能希望通过搜索以下行来仔细检查日志文件,以确保防伪功能已关闭:“警告:无法验证CSRF令牌的真实性”我使用protect\u from\u forgery:only=>:create
,删除警告消息,但是当我试图在注销中记录会话
时,它仍然只打印{}
,有什么想法吗?请将您的日志添加到问题中,以便我们可以仔细查看。嗯,短日志,没有任何线索。一般来说,存储会话会有问题吗?您正在使用哪种类型的会话存储?这里有一个关于你的好帖子。创建两个方法(如“set”和“show”)可能是一个有趣的测试,您可以在其中保存会话中的其他内容,并查看是否保存。
Started POST "/user/logout" for 127.0.0.1 at 2012-10-12 16:28:50 -0500
Processing by UserController#logout as */*
{} <--------------------------------------- here I printed out session
Rendered text template (0.0ms)
Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.0ms)
skip_before_filter :verify_authenticity_token, :only => [:login, :logout]