Получение уникального идентификатора сессии в Синатре - PullRequest
5 голосов
/ 11 апреля 2011

У меня есть простое веб-приложение, созданное с использованием Sinatra, с включенными сессиями.

Если я правильно понимаю, данные сеанса хранятся в зашифрованном файле cookie. При изменении данных сеанса значение файла cookie также изменяется.

Мне нужен уникальный идентификатор сеанса, который остается постоянным на протяжении всего сеанса. Есть ли такой идентификатор. Или я должен создать свое собственное уникальное значение и сохранить его в сессии сам?

Спасибо!

РЕДАКТИРОВАТЬ: В комментарии ниже я подумал о полезном сравнении. Если бы у меня был сервлет Java, я бы использовал JSESSIONID в качестве уникального идентификатора. Мне нужен синатра, эквивалентный JSESSIONID.

Ответы [ 4 ]

3 голосов
/ 05 сентября 2012

В приложении sinatra, если вы распечатаете session.keys, вы увидите, что есть «session_id», который содержит уникальный идентификатор для текущего сеанса.Вы можете получить доступ к этой 64-байтовой строке как сессия ["session_id"].

2 голосов
/ 16 июля 2012

Поскольку это один из первых результатов Google для данной темы, и он не содержит реальных примеров, вот простой способ создать собственный SESSION_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
1 голос
/ 30 декабря 2013

При изменении данных сеанса значение файла cookie также изменяется.

Это верно только в том случае, если вы используете файлы cookie для хранения данных сеанса, что является значением по умолчаниюСеанс хранения, используемый Синатрой.Более подробная информация на http://rubydoc.info/github/rack/rack/master/Rack/Session.

Мне нужен уникальный идентификатор сеанса, который остается постоянным на протяжении всего сеанса.Есть ли такой идентификатор.Или я должен сам создать свое уникальное значение и сохранить его в сеансе?

Вы можете получить идентификатор сеанса sinatra, используя метод экземпляра id в экземпляре session Rack::Session::Abstract::SessionHash.Подробнее на 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
0 голосов
/ 12 апреля 2011

Из того, что я могу сказать, JSESSIONID используется для передачи сеанса в строке запроса, и у Синатры нет ничего подобного, по крайней мере, нелегко доступного.Sinatra использует Rack для управления сеансами и по умолчанию использует cookie для хранения всех данных сеансов.В Rack есть и другие параметры сеанса, например memcached, где уникальный идентификатор сеанса хранится в файле cookie, но даже там Rack абстрагирует его, так что вам даже не нужно видеть идентификатор сеанса (хотя он все еще доступен, см. документацию ).

Если вы хотите пойти по этому пути, изучите связующее ПО Rack в Sinatra, но если вам нужен только уникальный идентификатор, тогда, вероятно, будет прощесоздайте его самостоятельно и сохраните в сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...