14

Rack を使用して、Sinatra アプリに「Remember Me」機能を実装しようとしています。

セッションの終了時または X 秒後にセッション cookie の有効期限が切れるように設定できますが、両方を行いたいと思います。

たとえば、ユーザーが「remember me」をクリックした場合、セッションが X 秒後に終了することを望みます。たとえば、私の app.rb には次のような行があります。

use Rack::Session::Cookie, :expire_after => 2592000, #30 days in seconds
                           :secret => MY_SECRET

ユーザーがログインしたときに、次のことを試みました。

if (!remember_me)
  env['rack.session.options'][:expire_after] = nil
end

ただし、これは Cookie 値を設定しません。

これを設定するには?

4

3 に答える 3

4

私はまったく同じことをしようとしていましたが、私にとって何が問題なのかを理解しました。expire_after 時間が設定されている場合、セッション Cookie はリクエストごとに設定されます。そのため、if (!remember_me) と言うと、そのリクエストの Cookie の有効期限は nil に設定されます。ただし、次のリクエストでは、セッション cookie が 2592000 の有効期限で再初期化されます。修正は、デフォルトの expire_after 時間を設定せず、代わりに次のように言うことです。

# don't set default expire time
use Rack::Session::Cookie, :secret => MY_SECRET


if(remember_me) 
  env['rack.session.options'][:expire_after] = 2592000 
end

残念ながら、デフォルトの expire_after 時間を設定し、その時間をプログラムで永久に延長する方法がわかりませんでした。

于 2012-06-23T18:01:15.783 に答える
0

これはおそらく、セッションがロードされる前に行う必要があります。

Rack::Session::Cookie#load_session および Rack::Session::Cookie#commit_session を参照してください。

于 2010-06-16T14:03:31.883 に答える
0

クリスの答えは実際にはうまくいきませんでした。元のセッション「オプション」に新しい「expire_after」値を含めたことを確認する必要があることがわかりました。

env['rack.session.options'][:expire_after] = 2592000

私は使うだろう:

env['rack.session.options'].merge! expire_after: 2592000

Sinatraを使用している場合は、ブロックにuse Rack::Session::Cookieステートメントを(expire_after設定なしで)必ず入れてください。configure

これでうまくいきました。

于 2013-05-19T23:54:03.970 に答える