Сиро: Сессия уже признана недействительной - PullRequest
2 голосов
/ 16 января 2012

Я использую Apache Shiro в веб-приложении.Проверка входа и проверки подлинности работает хорошо, но у меня есть проблема для реализации механизма выхода из системы / повторного входа в систему: Выход выполняется в сервлете:

    private void logout(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            log.debug("do logout");
            Subject subject = SecurityUtils.getSubject();
            subject.logout();
            resp.sendRedirect("end.html");
    }

Но после выхода из системы и повторного входа в систему я получаюследующая ошибка:

org.apache.shiro.session.InvalidSessionException: java.lang.IllegalStateException:
  getAttribute: Session already invalidated
  at org.apache.shiro.web.session.HttpServletSession.removeAttribute(HttpServletSession.java:167)
at org.apache.shiro.session.ProxiedSession.removeAttribute(ProxiedSession.java:135)
at org.apache.shiro.subject.support.DelegatingSubject.clearRunAsIdentities(DelegatingSubject.java:424)
at org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:246)

Вход в систему выполняется следующим образом (в методе компонента пользовательского интерфейса я использую ZK в качестве инфраструктуры пользовательского интерфейса):

  private void tryLogin(UsernamePasswordToken token) {
        Subject subject = SecurityUtils.getSubject();
        try {
              subject.login(token);
              ...

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

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Это произойдет в Shiro до версии 1.2, если кто-то (или что-то еще) аннулирует сеанс до того, как будет вызван Subject.logout() (например, httpSession.invalidate() и затем subject.logout()).

Эта ошибка возникла как ошибка в SHIRO-298 и уже была исправлена ​​в сборках 1.2.0-SNAPSHOT.Вы можете использовать одну из текущих сборок моментальных снимков или Shiro 1.2.0, когда она будет выпущена.

1 голос
/ 17 января 2012

похоже, ваш фреймворк не восстанавливает сеанс после выхода из системы. Вы можете попытаться форсировать новый сеанс, вызывающий subject.getSession () непосредственно перед вызовом входа в систему. Примерно так:

private void tryLogin(UsernamePasswordToken token) {
        Subject subject = SecurityUtils.getSubject();
        Session session = subject.getSession();
        try {
              subject.login(token);
...