我正在使用Sinatra框架制作一个非常简单的Web应用程序,需要登录会话。
我可以正常登录,但当我的朋友访问该网站时,他们就像我一样登录。我有一个朋友注册。当我重新访问该网站时,我以她的身份登录!我们在不同的设备上相距3000英里。
以下是我登录代码的要点..
require 'rubygems'
require 'sinatra'
# I have tried enabling/disabling the :session_secret
# set :session_secret, 'my_secret'
enable :sessions
before '*' do
begin
User.login(User.find(session[:me])) if session[:me]
end
end
post '/login' do
user = User.find_by_email!(params[:email]).authenticate!(params[:password])
session[:me] = user.id
User.login user
200
end
我也尝试将其添加到我的rackup文件
use Rack::Session::Cookie,
:key => 'my_app_key',
:path => '/',
:expire_after => 14400, # seconds
:secret => 'secret_stuff'
问题在于生产和开发环境。
Sinatra文档不建议enable :sessions
以外的任何配置
http://www.sinatrarb.com/faq.html#sessions
答案 0 :(得分:6)
User.login(User.find(session[:me])) if session[:me]
class User
def self.login(user)
@@me = user
end
end
这是你的问题。即使在请求之间,类变量仍然存在。
User
@@me
设置为您的用户session[:me]
是nil
,因为还没有会话User.login
未被调用,可以将User
@@me
设置为用户或为nil。因此,当没有session[:me]
时,User
@@me
不会被更改。
简而言之,不使用类变量来存储仅应保留单个请求的信息。