2011-04-11 48 views
4

我有一个使用Sinatra构建的简单的Web应用程序,并启用了会话。在Sinatra中获取唯一的会话ID

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

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

谢谢!

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

回答

0

从我所知道的JSESSIONID被用来在查询字符串中传递会话,而Sinatra没有类似的东西,至少不容易访问。 Sinatra使用Rack进行会话管理,默认情况下使用cookie来存储所有会话数据。 Rack中还有其他的会话选项,比如memcached,其中一个唯一的会话ID存储在一个cookie中,但即使在那里,也有机会摘要,所以你永远不需要看到会话ID(虽然它仍然可以访问,see the documentation) 。

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

+0

那不是我问。我知道如何访问会话数据。我正在寻找在会议期间保持独特的独特价值。例如,如果我有一个Java servlet,那么我会使用JSESSIONID来达到这个目的。我需要一个相当于JSESSIONID的Sinatra。 – 2011-04-12 00:25:40

+0

@Dave,我重写了我的答案。 – Andy 2011-04-12 04:02:48

+0

-JESSESSID通常通过cookie,但你有一般想法。谢谢,你或多或少地证实了我已经怀疑的事情。我决定使用UUID创建自己的标识符并将其存储在会话中。 – 2011-04-12 14:21:12

2

因为这是该主题的第一个谷歌搜索结果之一,它没有实际的例子,这里有一个简单的方法来创建自己的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 
+0

你为什么不使用Rack的预先存在的会话属性“session_id”? – pje 2012-11-26 21:45:13

+0

这是一个非常好的选择,这只是为了向人们展示如何制作一个。 – Qsario 2012-11-26 22:22:49

+0

如果机架可用,Rack已经自动使用'SecureRandom'(即Ruby> = 1.9.2)。 – 2014-08-19 12:01:31

3

在西纳特拉的应用程序,如果你打印出来session.keys,你会看到有一个“SESSION_ID”包含当前会话的唯一ID。您可以访问这个64字节的字符串作为会话[“session_id”]。

1

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

只有当您使用cookie来存储会话数据时,这才是真实的,这是sinatra使用的默认会话存储。更多详情,请致电http://rubydoc.info/github/rack/rack/master/Rack/Session

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

可以使用id实例方法上的Rack::Session::Abstract::SessionHashsession实例访问西纳特拉会话ID。更多详情,请致电http://rubydoc.info/github/rack/rack/master/Rack/Session/Abstract/SessionHash#id-instance_method

例子:

require 'sinatra' 

configure do 
    enable :sessions 
end 

get '/' do 
    session.id 
end 
+1

'session.id == session [:session_id]'fwiw – 2014-01-03 05:42:25