Ruby on rails 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

我有一个Rails应用程序,它使用静态html页面(不在app/views/中)向Rails服务器发送AJAX请求以进行登录和注销


我使用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]