sinatra应用程序中的会话在浏览器之间共享

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

Ale*_*yne 6

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)

这是你的问题.即使在请求之间,类变量仍然存在.

  1. 你登录了
  2. User @@me 设置为您的用户
  3. 有人在访问该网站.
  4. session[:me]nil因为没有会议还
  5. User.login未调用,可以设置User @@me为用户或为nil.

所以当没有时session[:me],User @@me不会改变.

简而言之,不要使用类变量来存储仅应保留单个请求的信息.