jch*_*ook 2 ruby session web-applications sinatra
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我也尝试将其添加到我的rackup文件中
use Rack::Session::Cookie,
:key => 'my_app_key',
:path => '/',
:expire_after => 14400, # seconds
:secret => 'secret_stuff'
Run Code Online (Sandbox Code Playgroud)
问题出在生产和开发环境上.
Sinatra文档不建议除http://www.sinatrarb.com/faq.html#sessions之外的任何配置enable :sessions
User.login(User.find(session[:me])) if session[:me]
class User
def self.login(user)
@@me = user
end
end
Run Code Online (Sandbox Code Playgroud)
这是你的问题.即使在请求之间,类变量仍然存在.
User @@me 设置为您的用户session[:me]是nil因为没有会议还User.login未调用,可以设置User @@me为用户或为nil.所以当没有时session[:me],User @@me不会改变.
简而言之,不要使用类变量来存储仅应保留单个请求的信息.