Rack Session Cookie和Sinatra - 设置和访问数据

8
我曾经使用 Rack Session Pool,但是我的用户会从一个 Web 服务器线程跳转到另一个线程,导致 session 数据过期。我开始尝试在 Sinatra 中启用 :sessions,但是由于有多个使用 Sinatra 的应用程序(看起来使用相同的密钥-不确定是否因为是同一主机),所以我无法使用该功能。
因此,由于我的应用程序会互相干扰,我现在尝试使用 Rack Session Cookie 并设置变量(与启用 :sessions 相同,但可以设置变量)。
很好,这样可以工作!但是现在我无法像在 Rack Session Pool 和 enable: sessions 中使用时那样访问 session 数据。
session[:user] = nick
puts session[:user]

你可以在Pool和Sinatra启用: sessions时使用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 大吗?!) - 这不可能是因为启用:sessions 是完全正常的。


只需在每个请求中转储request.cookies,看看是否能找到任何可疑的内容。 - Zimbabao
2个回答

13

以下是我解决此问题的步骤:

  use Rack::Session::Cookie, :key => 'my_app_key',
                             :path => '/',
                             :expire_after => 14400, # In seconds
                             :secret => 'secret_stuff'

你是否看到上面的区别?- 如果我让Rack::Session::Cookie指定域或浏览器(无论是谁),在多个Sinatra/Rack应用程序之间就不会出现错误...


这种方法不是非常不安全吗? - include
如果只是一个没有实际身份验证/授权数据的 cookie,那么不,你只是设置了会话并在其中放置了一些数据。 - nictrix
我也遇到了同样的问题,并尝试完全按照你的解决方案操作。但现在,无论我将什么内容放入“session”哈希表中,执行before do; p session ; end后只显示{"session_id"=>"b59..."} - Lawrence I. Siden
这很奇怪,Sinatra和Rack的版本是什么? - nictrix

2

问题出在 'localhost' 域名上。这篇文章详细解释了为什么将 localhost 作为域名是行不通的:Cookies on localhost with explicit domain

解决方法是在您的 hosts 文件中设置一个域名,例如:

127.0.0.1    superduper.dev

接下来在会话设置中将您的域名设置为superduper.dev。然后在开发过程中,您可以访问所需的任何端口。例如:superduper.dev:5000。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接