HttpSessionListener (sessionCreated / destroy) - странное поведение - PullRequest
5 голосов
/ 30 мая 2011

Я пытаюсь использовать HttpSessionListener:

public class SessionListener implements HttpSessionListener
{
  public void sessionCreated(HttpSessionEvent event) {
    System.out.println("ID Session Created: " + event.getSession().getId());
  }
  public void sessionDestroyed(HttpSessionEvent event) {
    System.out.println("ID Session Destroyed: " + event.getSession().getId());
  }
}

web.xml:

<listener>
  <listener-class>session.SessionListener</listener-class>
</listener>

UserManager.java :

@SessionScoped
@ManagedBean(name="userManager")
public class UserManager extends Tools
{
  /**/
  private static final long serialVersionUID = -8522314095497978567L;

  private String username;
  private String password;

  private transient HttpSession session = null;

  public String login() 
  {
    user = (User) find(username, password);
    if (user != null) 
    {
      username = password = null;

      FacesContext context = FacesContext.getCurrentInstance();
      session = (HttpSession) context.getExternalContext().getSession(true);
      session.setAttribute("id", user.getID());
    } 
  }

  public void logout() 
  {
    user = null;
    FacesContext context = FacesContext.getCurrentInstance();
    session = (HttpSession) context.getExternalContext().getSession(true);
    session.invalidate();
  } 
  // getters and setters ----------------------------------------------------
}

Работает, но немного странно.

Если я выхожу из системы, он сообщает консоли:

ID Session Destroyed: 807DEDB88D35C0351BF2B9FBA83519AB
ID Session Created: 8A029C95E6BA9DF17FB91C7F3AC81B24

Если вход в систему, в консоли ничего нет.

Что я делаю не так?

Ответы [ 2 ]

17 голосов
/ 30 мая 2011

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

Когда вы выходите из системы, вы заставляете сервер отказаться от текущего сеанса, но, так как ему все еще необходимо связаться с клиентом, новый(«чистый») сеанс создан.Этот новый сеанс, вероятно, все еще действует, когда вы входите в систему.

Я уверен, что если вы выключите свой сервер и удалите весь его рабочий кеш, вы увидите сообщение о создании сеанса при первом попадании из вашегобраузер.

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

session = (HttpSession) context.getExternalContext().getSession(true); Приведенная выше строка в методе выхода из системы должна иметь 'getSession ()' без true.

getSession (логическое значение)

Возвращает текущий связанный HttpSessionс этим запросом или, если текущий сеанс отсутствует и true создания, возвращает новый сеанс.

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