5

我正在处理一个 Sinatra 项目,并在会话中设置了一些变量以供以后使用。

我需要帮助的场景是我想访问中间件类中的会话对象。我正在使用守望者进行身份验证。

我想在中间件类中做类似的事情:

class MyMiddleware
    def initialize(app, options={})
        @app = app
    end

    def call(env)
        puts "#{session.inspect}" 
    end
end

有没有可能这样做?

想法?

4

2 回答 2

9

在 Rack 中间件中不能使用 Sinatra 的session方法,但是可以通过envhash 直接访问 session。

确保 session 中间件在你的中间件之前(所以在 Sinatra 中enable :sessions应该在 before use MyMiddleware),然后 session 可以通过 key 获得'rack.session'

class MyMiddleware
  def initialize(app, options={})
    @app = app
  end

  def call(env)
    puts env['rack.session'].inspect
    @app.call(env)
  end
end

您可能更喜欢使用Rack::Request对象来更轻松地访问会话和env哈希的其他部分:

def call(env)
  request = Rack::Request.new(env)
  puts request.session.inspect
  # other uses of request without needing to know what keys of env you need
  @app.call(env)
end
于 2012-02-02T18:43:16.243 回答
0

对我来说,马特的回答很有效,但我必须确保我use在 sinatra 中的陈述顺序正确。cookie 声明必须在我的中间件之前:

class ApiDocs < Sinatra::Base

use Rack::Session::Cookie, ... #etc
use MyMiddleware # my middleware that uses session

于 2021-01-06T23:32:07.653 回答