2

セッション エンジンをセットアップするときに、Sinatra アプリのセッション有効期限を設定できます。

  use Rack::Session::Cookie, :expire_after => 60*60*3, :secret => 'xxxx'

しかし、特定のユーザーに対してより長いセッションを有効にしたいと考えています。2週間と言います。

    session[:expires] = ?? #how and where do I put this.?

各呼び出しで設定する必要がありますか (行う前に?)、または一度で十分ですか? session[:expires] は正しい設定ですか?

4

2 に答える 2

1

最初にコマンドでexpire_after値を設定しないことを確認してから、ブロックに入れます。次に、「有効期限」変数 (この例で考えてみましょう) を作成するか、 . ユーザーごとに、ログイン時に設定を取得し、次のコマンドを発行します。use Rack::Session::Cookieuse Rack::Session::Cookieconfigureexpiry_timeconfigexpiry_time

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

それはあなたが求めていることをするはずです。

これがうまくいかない場合は、env...merge!コマンドをbeforeブロックに入れてみてください。

于 2013-05-20T00:01:54.567 に答える
0

afterSinatraのフィルターを介してこれを実行しようとしましたが、うまくいきませんでした。afterフィルターが実行された後にセッションが設定されるのではないかと思います。

require 'sinatra'

class SessionExpiryModifier
  def initialize(app,options={})
    @app,@options = app,options
  end
  def call(env)
    warn env["rack.session.options"].inspect
    t = Time.now.to_i.even? ? 10 : 60
    env["rack.session.options"].merge! :expire_after => 60 * 60 * t
    @app.call env
  end
end

configure do
  use Rack::Session::Cookie,
  :expire_after => 60*60*3, 
  :secret => 'xxxx' * 10
  use SessionExpiryModifier
end

get "/" do
  session[:usr] = Time.now
  env["rack.session.options"].inspect
end

ただし、これにより、Sinatra アプリから Rack フィルターに条件を取得して、どの分岐を取るかを決定することが非常に難しくなりますが、それは条件によって異なります。おそらく、フィルターが決定を下すために読み取ることができる何かをヘッダーに挿入します。

それが役立つことを願っています。

于 2013-04-10T15:52:23.010 に答える