Веб-сайт, который я поддерживаю, был разработан совместно с Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP и Hibernate (4.3.8.Final). Фронтальная часть является балансиром нагрузки (Kemp LoadMaster 3000) и площадка работает на Tomcat (8.5.54). Чтобы найти причину этой проблемы, я запускаю только один экземпляр Tomcat позади балансировщика нагрузки, чтобы иметь более простую систему. Каждая страница сайта (публичные страницы и страницы, просматриваемые после аутентификации) работает по протоколу HTTPS.
Следующий упрощенный код показывает, как продемонстрировать проблему:
@RequestMapping(value=/form, method = RequestMethod.GET)
public String surveyPageGet(HttpServletRequest request,
HttpServletResponse response,
Model model, Map<String, Object> map) throws IOException {
request.getSession().setAttribute(token, token-value);
System.out.println(request.getSession().getId());
return myform;
}
@RequestMapping(value=/form, method = RequestMethod.POST)
public String surveyPageGet(HttpServletRequest request,
HttpServletResponse response,
Model model, Map<String, Object> map) throws IOException {
System.out.println(request.getSession().getAttribute(token));
System.out.println(request.getSession().getId());
return redirect:/success;
}
Тайм-аут сессии на балансировщике нагрузки составляет 60 минут, а его постоянный режим - это
Super HTTP and Source IP
Время ожидания сессии в Tomcat также составляет 60 минут, указанных в файле web.xml
<session-config>
<session-timeout>60</session-timeout>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
Ниже приведена соответствующая настройка в Spring Security.
<security:http auto-config=false use-expressions=true request-matcher=regex entry-point-ref=authenticationEntryPoint >
<security:intercept-url pattern=^\/secure\/.*$ access=hasRole('ROLE_USER') />
<security:access-denied-handler ref=accessDeniedHandler />
<security:logout invalidate-session=true logout-url=/secure/logout logout-success-url=/ delete-cookies=JSESSIONID />
<security:custom-filter ref=authenticationFilter position=FORM_LOGIN_FILTER />
<security:anonymous username=guest granted-authority=ROLE_GUEST />
</security:http>
Вот мои наблюдения по идентификатору сессии и данным сессии в методе POST. В большом проценте случаев метод POST печатает один и тот же идентификатор сессии и значение токена, если отправка происходит в течение 60 минут после отображения формы. Это понятно. Чего я не понимаю, так это того, что в очень маленьком проценте случаев, когда отправка формы происходит до истечения 60-минутного лимита, ID сессии изменяется И значение токена становится нулевым или ID сессии остается тем же самым, но значение токена становится нулевым
Как я могу предотвратить изменение идентификатора сессии и потерю данных сессии, если сессия не тайм-аут? Мне это очень нужно из-за того, как работает сайт. Я провожу много времени в Интернете для возможного исправления и сделал много различных тестов (включая добавление кода, чтобы исключить возможность того, что проблема вызвана спамом или атакой), но безуспешно
Пожалуйста, не стесняйтесь сообщить мне, если вам нужна дополнительная информация о сайте.