Sinatra在post上清除会话
enable :sessions set :session_secret, 'secret' post '/login' do session[:loggedInUser] = jsondata['username'].to_s puts session[:loggedInUser] + " is the session" end
在这一点上,一切都很好。 当我像这样阅读会话时:
get '/debug' do session.inspect end
它就在那里。 但问题来了。 当我稍后再次发送邮件请求时:
post '/foo' do # do nothing end
会话已清除。
为什么? 这是一个错误吗?
编辑
我已经缩小了问题范围:我通过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
来自Sinatra FAQ :
如果您需要为会话设置其他参数,例如到期日期,请直接使用Rack :: Session :: Cookie而不是enable:sessions:
我遇到了和你一样的问题:会议正在邮寄。
我不知道为什么会这样,但这是我的解决方案:
#enable :sessions use Rack::Session::Cookie, :key => 'rack.session', :path => '/', :secret => 'your_secret'
我实际上只是use Rack::Session::Cookie ...
替换了enable :sessions
位use Rack::Session::Cookie ...
现在一切都很好。
添加set :session_secret, SESSION_SECRET
,一切正常。
set :session_secret, SESSION_SECRET enable :sessions
然后我发现,Sinatra的README确实提到了这一点:
为了提高安全性,cookie中的会话数据使用会话密钥进行签名。 Sinatra为您生成随机秘密。 但是,由于此秘密会随着应用程序的每次启动而改变,您可能希望自己设置秘密,因此所有应用程序实例都共享它 :
设置:session_secret,’超级秘密’
发生这种情况是因为Sinatra会在应用程序的每次启动时重新生成会话cookie,如果您在apache或机架服务器后运行,可以启动或切换到另一个实例,您将遇到此问题。
更简单的解决方案是将秘密设置为固定值,例如:
set :session_secret, "328479283uf923fu8932fu923uf9832f23f232" enable :sessions
另一个答案表明这样做:
#enable :sessions use Rack::Session::Cookie, :key => 'rack.session', :path => '/', :secret => 'your_secret'
也工作,但只是因为它将秘密设置为固定值。
我没有看到任何问题。 这是我的代码。 试试这个,看看你是否还有这个问题。
require 'sinatra' configure do enable :sessions set :session_secret, 'secret' end get '/login' do session[:foo] = Time.now "Session value set." end get '/fetch' do "Session value: #{session[:foo]}" end get '/foo' do "Session value: #{session[:foo]}" end get '/logout' do session.clear redirect '/foo' end http://localhost:4567/login #=> Session value set. http://localhost:4567/fetch #=> Session value: 2013-09-17 09:42:56 +0100 http://localhost:4567/foo #=> Session value: 2013-09-17 09:42:56 +0100 http://localhost:4567/logout #=>(redirects to) http://localhost:4567/foo #=> Session value: