2011-04-11 25 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