Spring MVC, Spring Security en Tomcat: gewijzigde sessie-ID en verloren sessiegegevens

stemmen
16

De website die ik ondersteun is ontwikkeld met Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP, en Hibernate (4.3.8.Final). De voorkant is een loadbalancer (Kemp LoadMaster 3000) en de site draait op Tomcat (8.5.54). Om de oorzaak van dit probleem te achterhalen, draai ik slechts één Tomcat exemplaar achter de loadbalancer om een eenvoudiger systeem te hebben. Elke pagina op de site (publieke pagina's en de pagina's gezien na authenticatie) draait onder HTTPS.

De volgende vereenvoudigde code laat zien hoe het probleem kan worden aangetoond:

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

De sessie time-out op de loadbalancer is 60 minuten en zijn aanhoudende modus is

Super HTTP and Source IP

De sessie timeout op Tomcat is ook 60 minuten gespecificeerd in web.xml

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

Het volgende is de gerelateerde setup in 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>

Hier zijn mijn opmerkingen over de sessie-ID en sessiegegevens in de POST-methode. Voor een groot percentage van de tijden drukt de POST-methode dezelfde sessie-ID en tokenwaarde af als het indienen binnen 60 minuten na het tonen van het formulier plaatsvindt. Dit is begrijpelijk. Wat ik niet begrijp is dat voor een zeer klein percentage van de gevallen waarin het formulier ingediend wordt voor de 60 minuten limiet, het sessie-ID verandert EN de symbolische waarde nul is of de symbolische waarde hetzelfde blijft MAAR dat de symbolische waarde nul is

Hoe kan ik voorkomen dat de sessie-id verandert en sessiegegevens verloren gaan als een sessie niet time-out is? Ik heb dit echt nodig vanwege de werking van de site. Ik breng veel tijd online door voor een mogelijke oplossing en heb veel en verschillende tests gedaan (inclusief het toevoegen van code om de mogelijkheid uit te sluiten dat het probleem wordt veroorzaakt door spam of een aanval), maar geen succes

Laat het me weten als je meer informatie over de site nodig hebt.

De vraag is gesteld op 07/06/2020 om 17:53
bron van user
In andere talen...                            

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