2013-04-08 3 views
2

Вы можете установить сеанс истечения срока действия для приложения Синатра при настройке сеанса двигатель:Как установить сеанс [: истекает] в стойку сессии (Sinatra)

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

Но я хочу, чтобы позволить более продолжительной сессии для определенных пользователей. Скажите две недели.

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

Нужно ли устанавливать на каждый вызов (раньше?) Или когда-то достаточно хорошо? Является ли сеанс [: истекает] правильным выбором?

ответ

0

Я попытался сделать это с помощью фильтра after в Sinatra, но это не сработало, я думаю, он устанавливает сеанс после того, как фильтры 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 

Однако, что делает его намного труднее получить условный из приложения Синатра в фильтр Rack, чтобы решить, на какой ветви принять, но это зависит от того, что ваше состояние. Возможно, что-то вложено в заголовки, которые фильтр может прочитать, чтобы принять решение.

Надеюсь, что это поможет.

1

Сначала убедитесь, что вы не установили значение expire_after с помощью команды use Rack::Session::Cookie, а затем положите use Rack::Session::Cookie в свой блок configure. Затем создайте переменную «время истечения» (скажем, expiry_time для этого примера) или установите в config. Теперь для каждого пользователя, при их входе в систему, получить их установку expiry_time и выполнить следующую команду:

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

Это должно делать то, что вы просите.

Если это не сработает, попробуйте ввести команду env...merge! в блок before.