2012-08-16 72 views
10

Sinatra不会在Chrome上通过重定向保留我的会话。这是创造一个全新的会议,我失去了我以前的会议数据。Sinatra不会在Chrome上持久保留重定向会话

为例(类似于the Sinatra docs),我做这样的事情:

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 

我想这事做与不同的浏览器重定向后处理会话如何应对响应。有没有人看到过类似的东西,或者有什么想法如何解决这个问题,同时仍然使用会话?

在此先感谢!

+2

Sinatra中的默认会话处理是通过cookie完成的,所以我猜想这与Chrome处理(或拒绝处理)重定向的Set-Cookie请求有关。不知道如何处理这个问题,但围绕整个问题的一个简单方法是使用基于数据库的会话,或使用redis或类似的内存会话。 – Jonah 2012-08-17 03:55:15

+0

你的环境是什么?我刚刚解决了一个涉及会话存储器消失的问题,可能会引起人们的兴趣,但这取决于发生在哪里/如何发生在您身上。 – 2012-08-19 22:25:24

+0

我遇到了同样的问题,使用分段作为环境。 – 2012-08-21 23:22:11

回答

0

请尝试至禁用所有自定义Cookie管理扩展功能都是Chrome(如果有)。 之后在检查标题开发人员工具网络。应该看到“Cookie:”字段。

1

添加到您的主应用程序文件: 使用机架::会议::饼干,:键=> 'rack.session', :PATH => '/', :秘密=>“一些随机-string'

随着增加,你应该能够分配会议['不管'],并按预期工作。

+0

这适用于pcDuino 3b sinatra – 2016-01-10 16:13:46

+0

任何人都可以解释为什么这应该解决这个问题?阅读Sinatra文档说它可以用来为会话添加额外的参数,但我不确定它能做什么:会话不会? – Michael 2016-02-01 19:08:11

0

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

0

这样做enable :sessions你只得到每个请求访问会话。 Sinatra无法保留对之前呼叫的引用(您的重定向),因为它被视为另一个请求。

因此,长话短说:

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

始终使用enable :sessions有一个秘密,否则你的会话重建每次看到机架的请求。