20
enable :sessions
set :session_secret, 'secret'

post '/login' do
        session[:loggedInUser] = jsondata['username'].to_s
        puts session[:loggedInUser] + " is the session"
end

この時点ですべてが良好です。このようにセッションを読むと:

get '/debug' do
    session.inspect
end

そのすべてがあります。しかし、ここで問題が発生します。後で別の投稿リクエストに行くとき:

post '/foo' do
    # do nothing
end

セッションがクリアされます。

なんで?これはバグですか?

編集

問題を絞り込みました: Sinatra を nginx 経由でプロキシパスしhttp://app.local/backendます。これが問題の発生時です。Sinatra を実行するhttp://localhost:4567と、すべて期待どおりに動作します。

解決

Rack::Session::Cookieデフォルトの代わりに使用enable :sessions:

use Rack::Session::Cookie, :key => "rack.session",
:path => "/backend"
# etc

シナトラ FAQから:

有効期限など、セッションに追加のパラメーターを設定する必要がある場合は、enable :sessions の代わりに Rack::Session::Cookie を直接使用します。

4

5 に答える 5

18

私はあなたと同じ問題に苦しんでいました: セッションはポストでクリアされていました.

なぜこれが機能するのかわかりませんが、これが私の解決策です:

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

私は文字通りenable :sessionsビットを交換しただけでuse Rack::Session::Cookie ...、今ではすべてがうまくいっています。

于 2013-10-08T15:18:24.930 に答える
2

これは、アプリケーションを起動するたびに Sinatra がセッション Cookie を再生成するために発生します。別のインスタンスを起動または切り替えることができる apache またはラック サーバーの背後で実行すると、この問題に直面します。

簡単な解決策は、シークレットを次のような固定値に設定することです。

 set :session_secret, "328479283uf923fu8932fu923uf9832f23f232"
 enable :sessions

これを行うことを提案する他の答え:

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

も機能しますが、シークレットを固定値に設定するためです。

于 2016-09-09T19:37:02.420 に答える
-3

問題はまったく見られません。これが私のコードです。これを試して、まだその問題があるかどうかを確認してください。

require 'sinatra'

configure do
  enable :sessions
  set :session_secret, 'secret'
end

get '/login' do
  session[:foo] = Time.now
  "Session value set."
end

get '/fetch' do
  "Session value: #{session[:foo]}"
end

get '/foo' do
  "Session value: #{session[:foo]}"
end

get '/logout' do
  session.clear
  redirect '/foo'
end

http://localhost:4567/login #=> Session value set.
http://localhost:4567/fetch #=> Session value: 2013-09-17 09:42:56 +0100
http://localhost:4567/foo #=> Session value: 2013-09-17 09:42:56 +0100
http://localhost:4567/logout #=>(redirects to) http://localhost:4567/foo #=> Session value:
于 2013-09-17T08:42:21.600 に答える