Spring MVC, Spring Security y Tomcat: cambio de identificación de la sesión y pérdida de datos de la sesión

votos
16

El sitio web que estoy apoyando fue desarrollado con Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP, e Hibernate (4.3.8.Final). El frontal es un equilibrador de carga (Kemp LoadMaster 3000) y el sitio funciona con Tomcat (8.5.54). Para encontrar la causa de este problema, estoy ejecutando sólo una instancia de Tomcat detrás del equilibrador de carga para tener un sistema más simple. Cada página del sitio (páginas públicas y las páginas vistas después de la autenticación) se ejecuta bajo HTTPS.

El siguiente código simplificado muestra cómo demostrar el problema:

@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;
}

El tiempo de espera de la sesión en el balanceador de carga es de 60 minutos y su modo persistente es

Super HTTP and Source IP

El tiempo de espera de la sesión en Tomcat es también de 60 minutos especificado en web.xml

<session-config>
    <session-timeout>60</session-timeout>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

Lo siguiente es la configuración relacionada en Seguridad de Primavera.

<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>

Aquí están mis observaciones sobre el ID de la sesión y los datos de la sesión en el método POST. Para un gran porcentaje de las veces, el método POST imprime el mismo ID de sesión y el mismo valor simbólico si la presentación tiene lugar dentro de los 60 minutos después de que se muestra el formulario. Esto es comprensible. Lo que no entiendo es que para un porcentaje muy pequeño de casos en los que el envío del formulario se produce antes del límite de 60 minutos, el ID de la sesión cambia Y el valor del token es nulo o el ID de la sesión sigue siendo el mismo PERO el valor del token es nulo

¿Cómo puedo evitar que cambie la identificación de la sesión y que se pierdan los datos de la misma si una sesión no se termina? Realmente necesito esto por cómo funciona el sitio. Paso mucho tiempo en línea para una posible solución e hice muchas y varias pruebas (incluyendo la adición de código para excluir la posibilidad de que el problema sea causado por el spam o un ataque), pero no tuve éxito

Por favor, siéntase libre de hacerme saber si necesita más información sobre el sitio.

Publicado el 07/06/2020 a las 17:53
fuente por usuario
En otros idiomas...                            

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