2011-07-19 10 views
5

Sinatraでリダイレクトとセッションを使用してサイト周辺のデータを渡そうとしています。ここでは、デバッグのためにPrettyPrintを使用して、簡単な例です:シンの出力を見てみるとSinatraセッションが期待通りに持続しない

require 'pp' 

require 'rubygems' 
require 'sinatra' 

enable :sessions 

get '/' do 
    session[:foo] = '12345' 

    puts 'session1' 
    pp session 

    redirect to('/redir') 
end 

get '/redir' do 
    puts 'session2' 
    pp session 
    'hello world' 
end 

、私は以下を参照してください。私はドキュメントで見てきた

>> Listening on 0.0.0.0:4567, CTRL+C to stop 
session1 
{"session_id"=> 
    "ea587d8afdcb2ada64f9b17cdd1fbae7b192dee5dfc2999ff9d323f1528f6a0f", 
"foo"=>"12345"} 
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET/HTTP/1.1" 302 - 0.0042 
session2 
{} 
127.0.0.1 - - [19/Jul/2011 10:33:24] "GET /redir HTTP/1.1" 200 11 0.0004 

すべてが、これは正常に動作する必要がありますことを示唆しています。実際には、私が直接要求しても、/redirのセッションデータは一切取得されません。その後のリクエストでは、/のようにセッションは継続します。

思考?

+0

シナトラセッションではCookieが使用されています。クッキーの出入りを確認するためにHTTPヘッダー(Firebugなど)を監視しようとしましたか?また、これを見てくださいhttp://stackoverflow.com/questions/5631862/problem-with-sinatra-and-session-variables-which-are-not-being-setこれとhttp://stackoverflow.com/questions/5693528/how-to-use-sinatra-session –

答えて

1

セッション変数が参照されるまで、セッションハッシュはロードされていないようです。

get '/redir' do 
    puts 'session2' 
    puts session[:foo] 
    pp session 
    'hello world' 
end 

私はシナトラがラックから直接セッションを使用していると思います。したがって、たとえば、あなたがにリダイレクトハンドラを変更する場合に予想される結果を取得します。ソースを簡単にのぞき見は[]の方法(およびその他)が呼び出されたときにセッションハッシュが遅延ロードされていることを示しています

https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb

+0

これはうまくいきますが、セッションハッシュのメンバーにアクセスする「適切な」方法は、 'session [:foo] .inspect'を使うことです。 –

10

FWIWが、私はこれがある理由については明らかではないんだけど、私に一度私のSinatraアプリをマルチインスタンス環境に移行したので、私はセッションが消えていくにつれて数多くの問題を抱えていました。最後に

、私はこの構文を使用した働いた、シンプルな「を有効にします。セッション」一方または「設定:セッション、本当」しませんでした:フォーマットはトムLianzaによって投稿なぜ

use Rack::Session::Cookie, :key => 'rack.session', 
          :path => '/', 
          :secret => 'your_secret' 
+1

これは完全に機能します。ありがとう! –

0

理由Sinatraがデフォルトで使用するのは

です。

set :session_secret, SecureRandom.hex(64) ランダムシークレットを選択するには、複数の環境が存在するため、それぞれが異なるクッキーを使用する異なるシークレットを使用します。 もちろん、SVCにチェックインされていない環境変数またはConfigファイルとして追加する必要があります。

Related Sinatra issue

関連する問題