2012-04-17 25 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方法。這是我的方式,因爲它提供了更多的配置靈活性。

的原因,這些工作是高速緩存控制器中間件是養殖請求到多個服務器實例和不設置會話密鑰,它只是做一個了每個服務器,從而打破了會議。