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

我也试着把这个添加到我的堆积文件

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会话

User.login(User.find(session[:me])) if session[:me]
class User
  def self.login(user)
    @@me = user
  end
end

这是你的问题。类变量持续存在,甚至在请求之间也是如此。

  1. 你登录
  2. User @@me被设置为您的用户
  3. 其他人访问该站点。
  4. session[:me]nil,因为还没有会话
  5. User.login不被调用,这将设置User @@me为用户或为nil。

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

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

最新更新