Где-то в спецификации сервлета есть утверждение о том, что недействительность сеанса точно соответствует состоянию, в котором в нем нет принципала.Это ключ.logout () и timeout делают недействительным сеанс и делают его недействительным, удаляя Принципал из него и все его привязки значений.
Все, что на самом деле делает JAAS, - это позволяет LoginModules
накапливать Принципалы в Subject
, как для пользователя, так и для его ролей.Все, что на самом деле нужно сделать с помощью метода JAAS logout()
, это очистить Субъект Принципалов, которые были добавлены тем же модулем login()
, или, более вероятно, commit()
, и это действительно просто для полной безопасности, если у вас естьдобавил такие вещи, как личные учетные данные в тему.Поскольку logout () не будет выполняться тем же экземпляром, что и login () / commit (), это удаление должно основываться на основном классе, а не на внутренней коллекции принципалов.
Выход из системы JAAS () не вызывается, когда сеанс истекает, но так как Принципал удаляется из сеанса, который не должен ни для кого иметь значение.
Если вы хотите отслеживать завершение сеанса по какой-либо другой причине, например, ведение журнала, makeВаш пользователь отправляет прослушиватель привязки сеанса и регистрирует завершение как выход из системы в методе valueUnbound (): на мой взгляд, это на 100% надежно.
Чтобы ответить на другие ваши вопросы, такого состояния как'залогинен в JAAS': JAAS предоставляет сервис входа / выхода в контейнер , а не в себя;и новый логин - это новый логин, в новый сеанс, независимо от того, истек ли предыдущий или нет.