Пользовательский идентификатор в обработке сеанса с помощью Java Servlet API - PullRequest
2 голосов
/ 13 октября 2008

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 13 октября 2008

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

2 голосов
/ 13 октября 2008

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

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

1 голос
/ 13 октября 2008

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

/** 
 * 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.String getId ()

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

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

...