Spring Security не прерывает сеанс при закрытии браузера - PullRequest
6 голосов
/ 01 февраля 2012

Я использую Spring Security 3.1 и использую

 <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
  • Я открываю браузер и захожу (например, IE9)
  • Я закрываю этот браузер
  • Я открываю другой браузер (например, Firefox)
  • Я не могу войти в систему, потому что я все еще вошел в другой браузер

Есть ли способ принудительно закрыть сеанс при закрытии браузера? Мне нужно сохранить max-сессий до 1 для контроля параллелизма.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Я бы добавил свой собственный фильтр непосредственно перед «CONCURRENT_SESSION_FILTER» и проверил бы в URI запроса строку типа «force-logout.do» (или что-то подобное).

Тогда в сгенерированном HTML-файле у меня будет обработчик событий JavaScript, подобный следующему:

<script type="text/javascript">
function force_logout() {
  // AJAX request to server notifying that the browser has been closed.
}
</script>

<body onbeforeunload="force_logout();">
</body>

Это будет работать для IE и Firefox (вы должны проверить и другие браузеры). Вашему фильтру просто нужно проверить URI и выполнить session.invalidate() в случае, если он соответствует «URI принудительного выхода из системы» и немедленно вернуться или просто пропустить запрос к цепочке фильтров.

ПРИМЕЧАНИЕ. Я не добавляю код AJAX, поскольку не знаю, используете ли вы конкретную среду AJAX. С prototype.js это было бы довольно просто.

1 голос
/ 05 января 2018

У меня была похожая проблема, например

  1. Если вы вошли в систему с каким-то пользователем, скажите zzzz
  2. Вы закрыли браузер
  3. Снова пытаетесь войти в систему с тем же пользователемzzzz
  4. Не удалось войти в систему с сообщением о превышении максимального сеанса

Код, указанный в файле безопасности Spring:

<session-management invalid-session-url="/?timeout=true">
<concurrency-control max-sessions="1" expired-url="/logout?timeout" />

Я решил эту проблему, добавив запись тайм-аута сеанса в файл web.xml.Я установил значение тайм-аута сессии как 5 минут, собрал приложение и развернул.Работает нормально.

Может быть, это кому-нибудь поможет.

Спасибо, Атул

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