11

Sinatra 没有通过 Chrome 上的重定向来保持我的会话。它正在创建一个全新的会话,我丢失了所有以前的会话数据。

作为一个例子(类似于Sinatra 文档),我正在做这样的事情:

enable :sessions

get '/foo' do
  session[:user_id] = 123
  session[:session_id] # "ABC", for example

  redirect to('/bar')
end

get '/bar' do
  # this is "DEF" when responding to Chrome (wrong), 
  # but "ABC" when responding to Firefox or Safari (right)
  session[:session_id]

  # this is nil when responding to Chrome (wrong),
  # but 123 when responding to Firefox or Safari (right)
  session[:user_id]
end

我认为这与不同浏览器在重定向响应后如何响应处理会话有关。有没有人见过类似的东西,或者对如何在仍然使用会话的同时解决这个问题有任何想法?

提前致谢!

4

4 回答 4

2

将此添加到您的主应用程序文件中:使用 Rack::Session::Cookie, :key => 'rack.session', :path => '/', :secret => 'some-random-string'

添加后,您应该能够分配 session['whatever'] 并使其按预期工作。

于 2015-05-08T21:31:41.680 回答
1

通过这样做enable :sessions,您只需访问每个请求的会话。Sinatra 无法保留对上一个调用(您的重定向)的引用,因为它被视为另一个请求。

因此,长话短说:

set :session_secret, "SecureRandom.new(10) generated thing" enable :sessions

始终enable :sessions与秘密一起使用,否则每次 rack 看到请求时都会重新创建会话。

于 2017-09-26T03:46:49.153 回答
0

请尝试禁用所有自定义 cookie 管理扩展是 Chrome(如果有)。之后在Developer toolsNetwork中检查标题。应该看到“Cookie:”字段。

于 2012-11-17T16:07:44.723 回答
0

我认为只是因为您没有设置:session_secret,请参阅我的回答here

于 2016-08-26T07:57:29.257 回答