Пользовательский идентификатор при обработке сеанса с помощью API сервлета Java

#java #session #web-applications #servlets

Вопрос:

Можно ли назначить пользовательский идентификатор сеансу HTTP через API сервлета?

Я знаю, что обработка сеансов с любого сервера приложений, например, Tomcat, достаточно хороша для создания уникальных идентификаторов. Но у меня есть пользовательские уникальные идентификаторы сеанса, основанные на информации о пользователе и времени, поэтому это не будет повторяться.

И я просмотрел каждую документацию по обработке сеансов, но нигде не нашел того, что мне нужно.

Это требование для проекта, поэтому, если это невозможно, мне нужно знать причины (или это доступно только через API?).

Ответ №1:

Если вы используете Tomcat, вы можете создать пользовательский менеджер сеансов (см. Это обсуждение). Затем у вас будет доступ к объекту сеанса Tomcat и вы сможете вызвать setId.

Ответ №2:

API сервлета не поддерживает создание собственного значения файла cookie. На самом деле, это не гарантирует, что сеансы поддерживаются с помощью файлов cookie… в нем конкретно говорится, что они могут поддерживаться с помощью такого механизма, как «Перезапись URL». Это гарантирует, что сеанс каким-то образом поддерживается, и для этого в значительной степени требуется какой-то уникальный идентификатор, который передается в браузер и возвращается, но в API сервлета не предусмотрен механизм для кода сервлета, чтобы контролировать, какое значение используется. Также обычные контейнеры сервлетов, о которых я знаю (например, Tomcat), не предоставляют средств для управления этим значением.

Однако ничто из этого не должно быть для вас проблемой, если я правильно понимаю ваши требования. Тот факт, что Tomcat (или любой другой контейнер сервлетов, который вы используете) создает уникальный идентификатор на основе своих собственных алгоритмов (которые содержат такие вещи, как криптографически безопасные генераторы случайных чисел, предотвращающие «угадывание» идентификаторов сеансов), не означает, что вы не можете создать ОТДЕЛЬНЫЙ идентификатор, соответствующий вашим требованиям (в зависимости от пользователя и времени, уникальный для всех сеансов… все, что вам нужно). Этот идентификатор может быть сохранен в сеансе (если это все, что вам нужно) или может быть сохранен в браузере в отдельном файле cookie (если вам нужно, чтобы он сохранялся во время сеансов). Единственным эффектом было бы то, что браузер хранил ДВА файла cookie-а большинство веб-сайтов хранят гораздо больше файлов cookie, чем это!

Ответ №3:

Эм…если у вас есть код для создания уникального идентификатора, вы можете просто сделать это:

 /** 
 * The String key of the user id attribute.
 */
public static final String USER_ID_KEY = "userIdKey";

// Set the user attribute (createUniqueUserId's parameters and return type are up to you)
httpSession.setAttribute(USER_ID_KEY, createUniqueUserId());

// Retrieve the user attribute later
httpSession.getAttribute(USER_ID_KEY);
 

Интерфейс HttpSession также предоставляет метод getId (), который описан здесь (копирование документации для справки).:

общедоступный java.lang.Строка getId()

Возвращает строку, содержащую уникальный идентификатор, присвоенный этому сеансу. Идентификатор присваивается контейнером сервлета и зависит от реализации.

Возвращает: строку, указывающую идентификатор, присвоенный этому сеансу