Разница между созданием сессии и куки? - PullRequest
5 голосов
/ 19 июня 2011

Я работаю над своим первым сайтом с Play!Framework, и в какой-то момент я вызываю этот метод, когда пользователь входит в систему:

static void connect(User user){
    session.put("userid", user.id);
}

Простое сохранение идентификатора пользователя в сеансе, и я могу проверить, установлен ли он для каждого запроса, работает нормально.Проблема в том, что после закрытия браузера cookie теряется, и пользователю необходимо снова войти в систему.Я хочу создать опцию «запомнить меня», и, похоже, единственный способ сделать это - создать cookie и отправить его с ответом, например:

response.setCookie("user", userdata, "14d");

Так что мне интересно,какой смысл создавать сеанс, когда он делает то же самое?(Но не дает мне никакого контроля над временем печенья).И еще одна вещь, которую я еще не нашел: как прочитать файл cookie из запроса?

(И я знаю, что файлы cookie, созданные с помощью setCookie, не зашифрованы, и мне нужно позвонить Crypto.sign())

Ответы [ 5 ]

3 голосов
/ 19 июня 2011

1) Сессия в игре!всегда поддерживается через cookie (т.е. на стороне клиента), это объясняется подходом «Ничего не делиться».

2) Если вы используете модуль Secure (или вы можете взглянуть на код и следовать, если выесли вы пишете свой собственный), метод authenticate () принимает параметр «запомнить» и устанавливает сеанс на 30 дней (response.setCookie("rememberme", Crypto.sign(username) + "-" + username, "30d");)

, т.е.если пользователь не хочет, чтобы его запоминали, его сеанс длится только до закрытия браузера.

3) Реальная разница, как вы упомянули, session.put () не позволяет установитьвремя сеанса истекло.Если вы хотите продлить сеанс, установите его в cookie-файле.

4) Если вам нужна дополнительная аутентификация во время выполнения пользователем CRUD (даже если пользователь выберет «запоминание» или его сеанс был явно продлен вами) лучше установить имя пользователя / идентификатор для кэширования (вместо того, чтобы снова устанавливать другой идентификатор для сеанса) и очистить его при выходе пользователя из системы.Это будет хорошо масштабироваться, если вы решите использовать распределенный кеш, такой как memcache.

5) Для чтения из cookie, request.cookies.get("name") пригодится.

1 голос
/ 19 июня 2011

Существует два способа хранения состояния в веб-приложениях - на стороне клиента и на стороне сервера.

На стороне сервера вы можете использовать объекты Session или Application.На стороне клиента вы можете использовать состояние просмотра, файлы cookie, скрытые поля и т. Д.

Время ожидания сеанса истекает.Когда вы получаете доступ к веб-приложению, для вас создается сеанс, который длится в течение продолжительного времени.Следовательно, это для каждого пользователя.Даже если вы увеличите продолжительность тайм-аута, он все равно истечет, если вы закроете браузер.Объект приложения является общим для всех пользователей.

Файлы cookie - это лучший способ хранить такую ​​информацию, которую необходимо запоминать в течение более длительного периода времени, например, в течение дня или дольше.Вы бы заметили, что Google позволяет вам оставаться в системе в течение нескольких дней.Это потому, что они используют куки для управления состоянием, а не сеансы.

0 голосов
/ 19 июня 2011

По сути, сеанс жизнеспособен только в течение периода времени, в течение которого пользователь взаимодействует с вашим приложением + время ожидания сеанса, которое вы укажете. Использование файлов cookie позволяет хранить соответствующую информацию для пользователя, чтобы при повторном возвращении на веб-сайт вы могли идентифицировать их еще раз.

Например, если у вас есть как конфиденциальная, так и нечувствительная информация о пользователе, вы можете сделать свое приложение более дружелюбным, определив, кто они, с помощью файла cookie и загрузив всю нечувствительную информацию. Как только они подтвердят свою подлинность, вы также сможете загрузить конфиденциальную информацию.

В MSDN есть отличный справочный материал о том, как работать с файлами cookie, по адресу http://msdn.microsoft.com/en-us/library/ms178194.aspx

0 голосов
/ 19 июня 2011

Сеанс позволяет привязать данные на стороне сервера к определенному сеансу браузера: автоматически создается cookie, который сервер использует для поиска данных на стороне сервера, связанных с конкретным браузером.

Контроль за истечением срока действия cookie-файлов сеанса обычно выполняется где-то в конфигурации вашей платформы (или иногда в файле web.xml, используемом сервером приложений).Вы можете прочитать cookie из метода HttpServletRequest getCookies.

РЕДАКТИРОВАТЬ: это документация getCookies, и для Play!Framework см. http://groups.google.com/group/play-framework/msg/6e40b07ff9b49a8a для примера постоянного входа в систему и поиска файлов cookie.

0 голосов
/ 19 июня 2011

Вы должны хранить идентификатор пользователя в cookie точно в той же точке, что и с атрибутом сеанса.Используйте HttpServletRequest.getCookies () для чтения cookie.Этот метод возвращает массив файлов cookie, поэтому вам нужно выполнить итерацию по массиву, чтобы определить соответствующие файлы cookie.

Чтобы изменить cookie, просто переопределите его.

...