Мы используем «ConcurrentSessionControlAuthenticationStrategy» не делать, со следующей конфигурацией:Весна безопасности - expireNow() на сессии ничего
<bean
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
<constructor-arg ref="clusteredSessionRegistryImpl" />
<property name="maximumSessions" value="1" />
<property name="exceptionIfMaximumExceeded" value="false" />
</bean>
Когда пользователь входит в систему, а затем входит в во второй раз с другой браузер - мы видим следующий код быть вызван (как и ожидалось):
protected void allowableSessionsExceeded(List<SessionInformation> sessions, int allowableSessions,
SessionRegistry registry) throws SessionAuthenticationException {
...
leastRecentlyUsed.expireNow();
}
The «leastRecentlyUsed» является фактическим старше сессии (как и ожидалось). Теперь все хорошо, но тот факт, что это истечение не закончит старшую сессию, другой сеанс браузера, который должен быть истек, может по-прежнему использовать приложение в параллелизме с новым сеансом в другом браузере. похоже, что процесс фактического уничтожения сессии не состоится.
1) Кто \ Что несет ответственность за уничтожение сеанса?
2) Как мы можем исправить эту проблему?
Сеанса что Уничтожен не «HttpSession», а внутренний объект, используемый Spring. Вы не можете аннулировать «HttpSession» из другого запроса. –
Я знаю, но не истекающий объект, используемый весной, должен привести к тому, что httpSession будет уничтожен в конце концов? (цитата из сигнатуры истекающего метода: «Сессия« Истек »как можно скорее удаляется
Filter
.» – UrbanlegЕсли вы настроили ее таким образом, но у вас ее нет. Ваша текущая настройка молча закрывает сеанс и создает новую 1. Это связано с тем, что вы установили 'exceptionIfMaximumExceeded' в' false', который будет в основном просто переходить. –