Sinatra在帖子上清除会话

sub*_*ero 18 ruby sinatra

enable :sessions
set :session_secret, 'secret'

post '/login' do
        session[:loggedInUser] = jsondata['username'].to_s
        puts session[:loggedInUser] + " is the session"
end
Run Code Online (Sandbox Code Playgroud)

在这一点上,一切都很好.当我像这样阅读会话时:

get '/debug' do
    session.inspect
end
Run Code Online (Sandbox Code Playgroud)

它就在那里.但问题来了.当我稍后再次发送邮件请求时:

post '/foo' do
    # do nothing
end
Run Code Online (Sandbox Code Playgroud)

会话已清除.

为什么?这是一个错误吗?

编辑

我已经缩小了问题范围:我通过nginx代理通过Sinatra,http://app.local/backend这就是问题出现的时候.如果我通过http://localhost:4567它运行Sinatra 一切都按预期工作.

使用Rack::Session::Cookie而不是默认值enable :sessions:

use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc
Run Code Online (Sandbox Code Playgroud)

来自Sinatra FAQ:

如果您需要为会话设置其他参数,例如到期日期,请直接使用Rack :: Session :: Cookie而不是enable:sessions:

小智 16

我遇到了和你一样的问题:会议正在邮寄.

我不知道为什么会这样,但这是我的解决方案:

#enable :sessions
use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'
Run Code Online (Sandbox Code Playgroud)

我真的只是替换了enable :sessions一点,use Rack::Session::Cookie ...现在世界上一切都很好.


Xer*_*ial 6

添加后set :session_secret, SESSION_SECRET,一切正常。

set :session_secret, SESSION_SECRET
enable :sessions
Run Code Online (Sandbox Code Playgroud)

然后我发现,Sinatra 的自述文件确实提到了这一点:

为了提高安全性,cookie 中的会话数据使用会话密钥进行签名。Sinatra 会为您生成一个随机秘密。但是,由于此秘密会随着应用程序的每次启动而更改,因此您可能需要自己设置秘密,以便所有应用程序实例共享它

set :session_secret, '超级秘密'