Вопрос о дизайне - постоянные данные в сеансе веб-приложения - PullRequest
2 голосов
/ 21 февраля 2010

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

Я имею в виду создание статической хеш-карты или какой-либо другой структуры данных, созданной во время загрузки веб-приложения, и я могу использовать ее для хранения объекта пользователя с sessionID в качестве ключа для хеш-карты.

Есть ли лучший способ? Любая помощь приветствуется.

Спасибо, - Vas

Ответы [ 4 ]

5 голосов
/ 21 февраля 2010

Вам не нужно управлять сессиями самостоятельно. Сервлетконтейнер сделает это за вас прозрачно, со вкусом HttpSession. Обычно вы используете HttpSession#setAttribute() для сохранения объекта в области сеанса и HttpSession#getAttribute() для получения объекта из области сеанса. Вы можете использовать HttpServletRequest#getSession(), чтобы получить ссылку на HttpSession.

например. в сервлете входа в систему:

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error?
}

Вы можете получить его позже в любом сервлете или фильтре в том же сеансе

User user = (User) request.getSession().getAttribute("user");
if (user != null) {
    // User is logged in.
} else {
    // User is not logged in!
}

Вы даже можете получить к нему доступ по EL в JSP:

<p>Welcome, ${user.username}!

(при условии, что существует метод Javabean getUsername())

4 голосов
/ 21 февраля 2010

Есть способ сделать это, и он определен в спецификации сервлета. Вы можете получить объект HttpSession и добавить объекты как «атрибуты».

Взгляните на API здесь: http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpSession.html

1 голос
/ 19 мая 2011

Мы создаем социальную сеть, такую ​​как livemocha.com, и рекомендуем вам включить в сессию как можно меньше.

Достаточно хранить только идентификатор пользователя в сеансе, и, конечно, вам не нужно гарантировать, что последующие изменения в объекте пользователя распространяются на объект, сохраненный в сеансе или БД (в зависимости от того, какой из них изменится). ; -)

1 голос
/ 21 февраля 2010

В зависимости от ваших потребностей и реализации вы также можете рассмотреть следующие варианты:

  • создание сериализации и сохранение объекта пользователя в самой сессии; в этом случае вы должны убедиться, что последующие изменения пользовательского объекта распространяются на объект, сохраненный в сеансе или БД (в зависимости от того, что изменится)
  • хранение только идентификатора пользователя в сеансе и внедрение кэширования в вашем DAO / репозитории, поэтому в случае необходимости реальный запрос к БД не будет вызываться; если вы используете Hibernate или какой-либо другой ORM, у вас может быть эта функция из коробки; это кажется наименее инвазивным, поскольку изменения в пользовательском объекте будут синхронизированы с состоянием приложения и БД, если должным образом обработаны постоянным уровнем

Возможно, есть еще много вариантов.

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