Sinatra会议没有像预期的那样坚持

时间:2011-07-19 14:40:07

标签: ruby session redirect sinatra thin

我正在尝试在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的任何会话数据,并且会话会按照您对/的后续请求的预期而持续存在。

思想?

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

if (h > 100 && 680 < d && d < 780) { write_string("HIT"); } 要选择随机密钥并且由于存在多个环境,每个环境将使用不同的秘密,从而导致矛盾的cookie。 当然,它应该作为环境变量或未检入SVC的Config文件添加。

Related Sinatra issue