Как я могу сделать Spring Security сохранить сеанс HTTP в базе данных для использования веб-приложения на нескольких серверах?

Хорошо, я хочу, чтобы мое веб-приложение могло использовать сеансы HTTP на нескольких веб-серверах. Я не могу использовать липкие сессии или репликации сеанса!

Какова наилучшая практика для Spring Безопасность для обработки с Spring Безопасность обрабатывает сеансы HTTP уже? Предоставляет ли Spring что-либо OOTB? Или у него есть возможность хранить информацию о сеансе в базе данных? SecurityContextPersistenceFilter?

Ответы

Ответ 1

Вы можете настроить контейнер для сохранения сеанса в базе данных с помощью JDBC. Если вы используете tomcat, вы можете настроить провайдер непрерывности сеанса JDBC. Я предполагаю, что вы можете делать аналогичную вещь и в других контейнерах.

Я документировал шаги по настройке настойчивости сеанса tomcat JDBC в своем блоге: http://gerrydevstory.com/2013/08/21/tomcat-7-jdbc-session-persistence/

В итоге вам нужна такая конфигурация в вашем контексте. xml:

<Manager className="org.apache.catalina.session.PersistentManager"
         maxIdleBackup="10">
  <Store className="org.apache.catalina.session.JDBCStore"
         connectionURL="jdbc:mysql://localhost/mytomcat?user=root"
         driverName="com.mysql.jdbc.Driver"
         sessionAppCol="app_name"
         sessionDataCol="session_data"
         sessionIdCol="session_id"
         sessionLastAccessedCol="last_access"
         sessionMaxInactiveCol="max_inactive"
         sessionTable="tomcat_sessions"
         sessionValidCol="valid_session" />
</Manager>

Однако, maxIdleBackup="10" выше указывает, что сеанс будет сброшен в jdbc только через 10 секунд бездействия. Я не знаю, будет ли работать с 0.

Я предполагаю, что вся работа для работы будет трудной без липкого сеанса балансировки нагрузки, например: как вы обеспечиваете очистку сеансов до следующего запроса? Вы не можете гарантировать, что следующий запрос будет обслуживаться тем же node.

Возможно, еще одна альтернатива - если вы можете взломать себя/там другую библиотеку провайдеров сеансов, которая напрямую записывается в базу данных.

Редактировать 21 мая 2014 года:

Я только что понял hazelcast WM - отличная библиотека для репликации одноранговых сеансов. Все, что вам нужно сделать, это включить фейерверки в канистру по классам, настроить hazelcast-wm в качестве фильтра на вашем web.xml и настроить hazelcast. Он автоматически реплицирует объекты сеанса по кластерам.