【问题标题】:Sinatra Sessions Not Persisting as ExpectedSinatra 会话未按预期持续
【发布时间】:2011-10-08 14:33:30
【问题描述】:

我正在尝试使用 Sinatra 中的重定向和会话来在站点周围传递一些数据。这是一个简化的示例,使用 PrettyPrint 进行调试:

require 'pp'

require 'rubygems'
require 'sinatra'

enable :sessions

get '/' do
  session[:foo] = '12345'

  puts 'session1'
  pp session

  redirect to('/redir')
end

get '/redir' do
  puts 'session2'
  pp session
  'hello world'
end

查看 Thin 的输出,我明白了:

>> Listening on 0.0.0.0:4567, CTRL+C to stop
session1
{"session_id"=>
  "ea587d8afdcb2ada64f9b17cdd1fbae7b192dee5dfc2999ff9d323f1528f6a0f",
 "foo"=>"12345"}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET / HTTP/1.1" 302 - 0.0042
session2
{}
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET /redir HTTP/1.1" 200 11 0.0004

我在文档中看到的所有内容都表明这应该可以正常工作。事实上,即使我直接请求它,我也从来没有得到任何/redir 的会话数据,并且会话仍然存在,正如您对/ 的后续请求所期望的那样。

想法?

【问题讨论】:

标签: ruby session redirect sinatra thin


【解决方案1】:

似乎在引用会话变量之前不会加载会话哈希。因此,例如,如果您将重定向处理程序更改为:

get '/redir' do
  puts 'session2'
  puts session[:foo]
  pp session
  'hello world'
end

我猜 Sinatra 是直接从 Rack 使用会话。快速查看源代码表明,当调用 [] 方法(和其他方法)时,会话哈希是延迟加载的:

https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb

【讨论】:

  • 这行得通,但事实证明访问会话哈希成员的“正确”方法是使用session[:foo].inspect
【解决方案2】:

FWIW,我不清楚这是为什么,但是一旦我将 Sinatra 应用程序移至多实例环境,我就开始遇到大量会话消失的问题。

最后,我发现使用这种语法有效,而简单的 'enable :sessions' 或 'set :sessions, true' 没有:

use Rack::Session::Cookie, :key => 'rack.session',
                           :path => '/',
                           :secret => 'your_secret'

【讨论】:

    【解决方案3】:

    Tom Lianza 发布的格式之所以有效是因为默认情况下 Sinatra 使用

    set :session_secret, SecureRandom.hex(64) 要选择一个随机秘密,并且由于存在多个环境,每个环境将使用不同的秘密,从而导致相互矛盾的 cookie。 当然,它应该作为环境变量或未检入 SVC 的配置文件添加。

    Related Sinatra issue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多