нужны переменные сеанса в valueUnbound? - PullRequest
1 голос
/ 10 июля 2011

Я использую метод valueUnbound, равный HttpSessionBindingListener, чтобы снять блокировку (запись из базы данных), до истечения сеанса:

@Override

public void valueUnbound(HttpSessionBindingEvent event) {
  String user = (String) event.getSession().getAttribute("currentUsr");
  removeLock(user);
}

Когда блокировка установлена, я настраиваюusername в качестве переменной сеанса.
Мне нужно это "username" в моем методе удаления блокировки.Но getAttribute вызывает исключение:

java.lang.IllegalStateException: getAttribute: Сессия уже признана недействительной

Мне нужна помощь в получении переменной сеанса ??или есть какой-то другой способ получить имя пользователя?


Нет, поскольку сессия была признана недействительной.

Несмотря на то, что я выяснил решение, я устанавливаю атрибут через контекст сервлета в методе valueBound и получаю его через : event.getSession (). GetServletContext (). GetAttribute ("cUser ");

работает нормально.Спасибо EJP


Я получил вашу точку зрения, EJP, вы правы, я делаю это сложно, я могу получить это из event.getValue ().+1 к вашему ответу, спасибо.

1 Ответ

2 голосов
/ 11 июля 2011

Хотя, я разобрался с решением, я устанавливаю атрибут через контекст сервлета в методе valueBound и получаю его через: event.getSession().getServletContext().getAttribute("cUser");

Итак. Вы храните данные области сеанса в области приложения. Понимаете ли вы, что таким образом данные распределяются между всеми посетителями веб-приложения? Посетитель X затем увидит атрибут, установленный посетителем Y, который посетил веб-сайт позднее. Это только усугубляет проблему.

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

  1. Сделайте currentUsr свойством класса, который реализует HttpSessionBindingListener, чтобы вам не нужно было захватывать его как отдельный атрибут сеанса.

  2. Используйте взамен HttpSessionListener. Метод sessionDestroyed() называется прямо перед аннулированием , поэтому у вас все равно должен быть доступ ко всем атрибутам.

...