在Sinatra中获取唯一的会话ID

时间:2011-04-11 15:52:58

标签: ruby sinatra

我有一个使用Sinatra构建的简单Web应用程序,并启用了会话。

如果我理解正确,会话数据将存储在编码的cookie中。随着会话数据的变化,cookie的值也会发生变化。

我需要一个在整个会话期间保持不变的唯一会话标识符。有没有这样的标识符。或者我必须创建自己的唯一值并将其存储在会话中吗?

谢谢!

编辑:在下面的评论中,我想到了一个有用的比较。如果我有一个Java servlet,我会使用JSESSIONID作为唯一标识符。我需要一个与JSESSIONID等效的Sinatra。

4 个答案:

答案 0 :(得分:3)

在sinatra应用程序中,如果打印出session.keys,您会看到有一个“session_id”,其中包含当前会话的唯一ID。您可以将此64字节字符串作为session [“session_id”]。

答案 1 :(得分:2)

因为这是该主题的第一个Google结果之一,并且它不包含任何实际示例,所以这是创建自己的SESSION_ID的简单方法。我们依靠概率和加密安全随机性来保持我们的ID唯一。

这是我放入饼干的唯一方法。我将所有其他数据保留在后端,以防止任何人篡改它。

require 'sinatra'
require 'securerandom'

# The configuration here is just an example.  Use your own secret, etc.
use Rack::Session::Cookie,  :key => 'SESSION_ID',
                            :expire_after => 60*60*24, # == one day
                            :secret => 'This one time, at band camp...'

before do   # Before every request, make sure they get assigned an ID.
    session[:id] ||= SecureRandom.uuid
end

get '/' do  # Show off your new ID.
    "Your ID is #{session[:id]}"
end

答案 2 :(得分:1)

  

随着会话数据的变化,cookie的值也会发生变化。

只有当您使用cookie存储会话数据时才会出现这种情况,这是sinatra使用的默认会话存储。更多详情请见http://rubydoc.info/github/rack/rack/master/Rack/Session

  

我需要一个在整个会话期间保持不变的唯一会话标识符。有没有这样的标识符。或者我必须创建自己的唯一值并将其存储在会话中吗?

您可以使用id session Rack::Session::Abstract::SessionHash实例上的require 'sinatra' configure do enable :sessions end get '/' do session.id end 实例方法访问sinatra会话ID。更多详情请见http://rubydoc.info/github/rack/rack/master/Rack/Session/Abstract/SessionHash#id-instance_method

示例:

{{1}}

答案 3 :(得分:0)

据我所知,JSESSIONID用于在查询字符串中传递会话,而Sinatra没有类似的东西,至少不容易访问。 Sinatra使用Rack进行会话管理,默认情况下使用cookie来存储所有会话数据。 Rack中还有其他会话选项,例如memcached,其中一个唯一的会话ID存储在cookie中,但即使是Rack也抽象出来,所以你不需要查看会话ID(虽然它仍然可以访问,{{ 3}})。

如果你想走这条路,那么就要看看Sinatra中的Rack中间件,但如果你需要的只是一个唯一的id,那么自己生成一个并将它存储在会话中可能会更容易。