2012-04-17 46 views
4

我已成功地排除了会议成员无法使用的问题,即使他们已设置并且想知道为什么会发生这种情况。我的情况可以描述为:Sinatra会员“消失”

  1. Sinatra应用程序使用:session
  2. 使用oAuth授权用户,并在此过程中设置:ret_url会话成员,以便应用程序知道授权后要回到哪里。
  3. 服务器上雪松堆栈(Heroku的)

这完美的作品,而在本地运行,但:ret_url会议成员完全来自在Heroku会话消失麒麟。我发现,如果我删除这段代码就解决了这一问题:

before do 
    cache_control :public, :must_revalidate, :max_age => 60 
    end 

问题1:我猜,我的cookie被被缓存而不:ret_url价值,这就是为什么它被打破?

问题2:我正在设置会话成员,如下面的路由条件代码所示,这是做错了吗?

# redirect users to login if necessary 
    set(:auth) do |access_token|  
    condition do 

     if request.request_method == 'GET' 
     session[:ret_url] = request.path_info 
     end 

     redirect '/' unless user_logged_in? 
    end 
    end 

我想使用缓存,并仍然有我的cookie有效。

+0

您是否设置了会话密钥?设置:session_secret,“超级秘密” – mscccc 2012-06-27 16:17:46

+0

我有,当我在本地运行我的末日应用,在那里存在的会话的成员,但在Heroku上运行时消失的问题。我已经使用OAuth,现在考拉与Facebook互动尝试,并最终都表现出了同样的问题。 – 2012-08-23 01:29:15

回答

1

很难看到正在发生的事情不知道所有的细节,但有一个简单的规则,你是最有可能违反了:不上,都应该做一些事情(除了只显示页)操作使用HTTP缓存。当http缓存打开时,浏览器甚至不会尝试重新加载页面并将其从浏览器缓存中呈现。

Cookies没有任何地方缓存,唯一cache_control也被设置CacheControl HTTP响应值

你的情况,你能做的最好的事情是添加有不采取行动的页面,你的前块路由列表:

before '/my/static/page' do 
    cache_control :public, :must_revalidate, :max_age => 60 
end 

最可能的是,你将有非常有限的路线,在那里你可以从HTTP缓存

+0

相关:你不应该使用':如果您的响应包括或以其他方式依赖于任何public'用户或特定会话。一个剔除掉所有传入的cookie和session数据,以防止我意外引用的东西 - 我通常我想缓存的资源建立一个专门的中间件。 – willglynn 2012-09-22 18:52:26

1

一个小伙子被阿勒·布朗(波在ARI),谁是不是这里的会员,但名称中受益值得赞扬答案,我指出,在正确的解决方案,这一点,按照the Sinatra FAQ,不使用enable :sessionsuse Rack::Session::Cookie按照

use Rack::Session::Cookie, :key => 'rack.session', 
          :domain => 'foo.com', 
          :path => '/', 
          :expire_after => 2592000, # In seconds 
          :secret => 'change_me' 

我已经添加到这个我config.ru,一切都很好。

我也注意到了在this post替代建议,set :session_secret, 'change_me',实际上,通过环境变量,即要做到这一点:

$ heroku config:add SESSION_KEY=a_longish_secret_key 

然后在你的应用程序

enable :sessions 
set :session_secret, ENV['SESSION_KEY'] || 'change_me' 

很明显,你可以也使用环境变量策略与Rack::Session::Cookie方法。这是我的方式,因为它提供了更多的配置灵活性。

的原因,这些工作是高速缓存控制器中间件是养殖请求到多个服务器实例和不设置会话密钥,它只是做一个了每个服务器,从而打破了会议。