我正在使用Rack Session Pool,但是我的用户会被一个网络服务器线程踢到另一个网络服务器线程上,使会话数据到期。我开始在Sinatra中启用:会话,但是我无法使用它,因为我有使用Sinatra的多个应用程序(它似乎正在使用相同的密钥 - 不确定这是因为它是否是相同的主机)
因为我的应用程序会互相破坏,我现在正在尝试使用Rack Session Cookie并设置变量(与启用相同:会话,但您可以设置变量)
太棒了,这样才行!但是现在我无法按照我使用它的方式访问会话数据,在Rack Session Pool和enable:sessions
中session[:user] = nick
puts session[:user]
你明白了......
问题是为什么我可以在Pool和Sinatra中使用session [:user]启用会话来访问会话数据:会话,但不能在Rack Session Cookie中访问会话数据?我错过了什么吗?我所做的只是在
之下config.ru
use Rack::Session::Cookie, :key => 'key',
:domain => "localhost",
:path => '/',
:expire_after => 14400, # In seconds
:secret => 'secret'
编辑:
做了一些更多的测试并发现它实际上将它放在会话变量中,但是一旦它移动到新方法或重定向,会话变量似乎被删除(这个cookie真的大于4KB?!) - 它不能是因为启用:会话工作得很好
答案 0 :(得分:11)
以下是我为解决此问题所做的工作:
use Rack::Session::Cookie, :key => 'my_app_key',
:path => '/',
:expire_after => 14400, # In seconds
:secret => 'secret_stuff'
你看到与上面的区别吗? - 没有域名,如果我让Rack :: Session :: Cookie指定域名或浏览器(无论是谁),我在mutliple Sinatra / Rack应用程序之间没有错误......
答案 1 :(得分:2)
问题在于域名'localhost'。该线程更详细地描述了为什么将localhost作为域不起作用:Cookies on localhost with explicit domain
修复方法是在主机文件中设置域名,如
127.0.0.1 superduper.dev
然后将您的会话设置中的域设置为superduper.dev。然后在开发过程中,您可以访问您可能需要的任何端口。防爆。 superduper.dev:5000