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 ...现在世界上一切都很好.
添加后set :session_secret, SESSION_SECRET,一切正常。
set :session_secret, SESSION_SECRET
enable :sessions
Run Code Online (Sandbox Code Playgroud)
然后我发现,Sinatra 的自述文件确实提到了这一点:
为了提高安全性,cookie 中的会话数据使用会话密钥进行签名。Sinatra 会为您生成一个随机秘密。但是,由于此秘密会随着应用程序的每次启动而更改,因此您可能需要自己设置秘密,以便所有应用程序实例共享它:
set :session_secret, '超级秘密'