Весна MVC, весна безопасности, и Tomcat: измененный идентификатор сессии и потерянные данные сессии

голоса
31

Веб-сайт, который я поддерживаю, был разработан совместно с 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 сессии остается тем же самым, но значение токена становится нулевым

Как я могу предотвратить изменение идентификатора сессии и потерю данных сессии, если сессия не тайм-аут? Мне это очень нужно из-за того, как работает сайт. Я провожу много времени в Интернете для возможного исправления и сделал много различных тестов (включая добавление кода, чтобы исключить возможность того, что проблема вызвана спамом или атакой), но безуспешно

Пожалуйста, не стесняйтесь сообщить мне, если вам нужна дополнительная информация о сайте.

Задан 07/06/2020 в 17:53
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more