【问题标题】:Load session using session id使用会话 ID 加载会话
【发布时间】:2014-06-27 13:44:06
【问题描述】:

我有一个 Sinatra 应用程序,其中一个规则要求 URL 包含会话 ID(从以前调用的 URL 返回)。如何使用会话 ID 引用的会话重载会话?

use Rack::Session::Pool

get "example/:session_id" do
  sessionId = params[:session_id]

  # how to reload the session now, using the sessionId?

end

感谢您的帮助!

【问题讨论】:

    标签: session sinatra rack


    【解决方案1】:

    路径中的会话 ID

    如果你必须使用路径中的会话 id,你可以使用这种 hacky 方式

    # app.rb
    require 'sinatra'
    
    configure do
      use Rack::Session::Pool, :key => 'session_id'
    end
    
    get "/example/:session_id" do
      session.id = params[:session_id]
      session[:force_load] = 'force' # force session.load!()
      session.delete(:force_load)    # remove dummy value
    
      session[:count] = session[:count].to_i + 1
      session.inspect
    end
    

    请求参数中的会话 ID

    如果您愿意将session_id 移动到请求参数(查询参数或正文参数),支持的方法是将:cookie_only 选项设置为false

    # app.rb
    require 'sinatra'
    
    configure do
      use Rack::Session::Pool, {
        :key => 'session_id', 
        :cookie_only => false, # adds request params as source for session id
      }
    end
    
    # works with /example?session_id=
    get '/example' do
      session[:count] = session[:count].to_i + 1
      session.inspect
    end
    

    演示

    $ ruby app.rb &> /dev/null  &
    
    $ curl -i localhost:4567/example?session_id=
    
      HTTP/1.1 200 OK 
      Set-Cookie: session_id=2a06759c64c130bc45036076; path=/; HttpOnly
    
      {"count"=>1}
    
    $ curl -i localhost:4567/example?session_id=2a06759c64c130bc45036076
    
      HTTP/1.1 200 OK 
      Set-Cookie: session_id=2a06759c64c130bc45036076; path=/; HttpOnly
    
      {"count"=>2}
    
    $ kill %1
    

    【讨论】:

      猜你喜欢
      • 2019-10-28
      • 2015-02-23
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2019-08-13
      • 2011-10-05
      相关资源
      最近更新 更多