2016-06-24 1 views
1

Helle everyone,Spring 4 - Session Management

В настоящее время я запускаю приложение весеннего веб-приложения предприятия внутри нашей компании, развернутое на сервере tomcat 8.

Теперь некоторые пользователи сообщают, что иногда они не могут подключиться, поскольку ошибка входа в систему отображается на странице входа.

А ну, вот почему:

моя сессия конфигурация настроена следующим образом:

<session-management> 
    <concurrency-control max-sessions="5" 
     error-if-maximum-exceeded="true" expired-url="/login" 
     session-registry-alias="sessionRegistry"/> 
</session-management> 

<form-login login-processing-url="/login" 
    login-page="/login" 
    authentication-failure-url="/login_error" /> 

<logout logout-url="/logout" logout-success-url="/login" 
    invalidate-session="true"/> 

сессии тайм-аута устанавливается в 4-х часов:

<session-timeout>240</session-timeout> 
  • когда пользователь запрашивает страницу входа, сеанс с ключом csfr хранится на стороне сервера.
  • Когда пользователь выходит из системы, его сеанс недействителен, и он перенаправляется на страницу входа в систему, так как новый сеанс с ключом csfr сохраняется снова на стороне сервера.
  • , когда пользователь уже имеет 5 сеансов (разные браузеры, устройства, странное поведение клиента) и пытается войти в систему в 6-й раз - при этом вход запрещен, поскольку превышен максимальный максимум сеанса.

Теперь в худшем случае есть 5 сеансов с сохраненным сервером только csrf-token, скажем, avg. срок службы 3 часа, блокируя пользователя от повторного подключения.

пожалуйста, может кто-то сказать мне, что есть лучшее решение, чем:

max-sessions="biggerNumber" 

и спасибо за чтение в любом случае ...

ответ

3

У Вас есть 2 возможности, которые можно комбинировать:

  • увеличить количество одновременных сеансов
  • уменьшить время ожидания сеанса (30 минут уже большой)

Но вы должны также более радикальным способом: изменить политику, чтобы не отклонять новое соединение, а отменить самый старый. Допускается из коробки с помощью пружинного безопасности, просто удалите error-if-maximum-exceeded="true" из concurrency-control тега:

<session-management> 
    <concurrency-control max-sessions="5" 
     expired-url="/login" 
     session-registry-alias="sessionRegistry"/> 
</session-management> 
+0

привет, спасибо за ответ.это именно то, что я искал. я собираюсь удалить ошибку-if-maximum -выше, поэтому самый старый сеанс отменяется. я не понял этого, читая документы безопасности - так спасибо за это! тайм-аут сеанса очень велик, но он запрашивается именно так. – user1386375

0

Я проверил документацию пружины ниже и протестирована.

http://docs.spring.io/spring-security/site/docs/current/reference/html/session-mgmt.html#concurrent-sessions

Оказывается, что вы должны добавить это в web.xml

<listener> 
    <listener-class> 
    org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
</listener> 

Этот слушатель будет удалить сеанс, подключенный к основной инстанции при выходе из системы. В противном случае сеанс по-прежнему подключается к главному экземпляру даже после выхода из системы. Вот почему вы будете получать ошибку «Максимальные сеансы XX для этого принципала превышены».

 Смежные вопросы

  • Нет связанных вопросов^_^