Сессия единого входа Jboss не уничтожается после maxInactiveInterval - PullRequest
0 голосов
/ 24 мая 2018

Мы успешно настроили единый вход в кластер JBoss EPA 6.4.17.

Каждый сеанс пользователя был настроен с maxInactiveInterval , равным 1 минуте.Таким образом, клиент будет продолжать посылать живой запрос на сервер каждые 30 секунд, чтобы поддерживать сеанс.Я проверил, что сеанс в кэше Jboss очищается при ручном выходе из системы.Точно так же действия закрытия вкладки и закрытия браузера обрабатываются должным образом.

В случае, если я завершу процесс браузера или разорву клиентское соединение с сервером, ожидается, что через 1 минуту кэш сервера будет уничтожен.Поскольку maxInactiveInterval сеанса составляет 1 минуту.Но его не уничтожили, как ожидалось.

  • При отладке.Я обнаружил следующее

    1. Поток Jboss продолжал работать для проверки правильности сеансов.т.е. ContainerBase.ContainerBackgroundProcessor
    2. Этот поток проверит правильность сеанса.если идеальное время сеанса больше, чем maxInactiveInterval, срок его действия истечет.
    3. По умолчанию сеанс Jboss maxEmptyLife равен 30 минутам.Но я переопределяю это как 0 минут, используя системные свойства.поэтому сеанс будет немедленно уничтожен.
    4. Операции ручного выхода из системы и тайм-аута сеанса вызывают session.invalidate ();
    5. Затем управление кодом достигло функции sessionEvent в ClusteredSingleSignOn.java
    6. В этом методе sessionEvent () (ниже приведен исходный код Jboss),

      // Was the session destroyed as the result of a timeout or
      // the undeployment of the containing webapp?
      // If so, we'll just remove the expired session from the
      // SSO. If the session was logged out, we'll log out
      // of all sessions associated with the SSO.
      boolean timedOut;
      boolean stopped = false;
      if ((timedOut = isSessionTimedOut(session)) || (stopped = isManagerStopped(session))) {
          WebLogger.WEB_SSO_LOGGER.tracef("remove session %s from SSO %s, isSessionTimedOut=%s, isManagerStopped=%s", session, ssoId, timedOut, stopped);
      
          removeSession(ssoId, session);
      
          // Quite poor. We hijack the caller thread (the Tomcat background thread)
          // to do our cleanup of expired sessions
          processExpires();
      } else {
          WebLogger.WEB_SSO_LOGGER.tracef("user logged out of SSO %s", ssoId);
          // The session was logged out.
          logout(ssoId);
      }
      

    элемент управления переходит к блоку IF во время сеанса и переходит к блоку ELSE вручной выход.

  • В IF BLOCK вызывается processExpires (), который используется для уничтожения уже истекших сеансов из кэша Jboss, но не уничтожает текущий сеанс из кэша Jboss.
  • Когда идеальное время сеанса больше, чем сеансы maxInactiveInterval,Элемент управления переходит к блоку IF приведенного выше фрагмента кода.что приводит к кешу Jboss для хранения сессии.(но ожидается уничтожить сессию из кэша Jboss)
  • Когда я открываю браузер через 1 час (что прекращается из-за остановки его процесса).Это побуждает меня перезагрузить окна со старым состоянием.когда я нажимаю перезагрузить.приложение регистрируется автоматически, так как сеанс браузера перехватывается на сервере Jboss.Но ожидается, что появится страница входа в систему.

Это проблема безопасности.где я могу получить доступ к серверу, используя запрос curl, как запрос ajax, даже после завершения работы браузера клиента.

Это существующая проблема?или любое исправление доступно в Jboss?

...