Spring MVC, Spring Security a Tomcat: změněno ID relace a ztracená data relace

hlasů
16

Web, který podporuji, byl vyvinut s Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP a Hibernate (4.3.8.Final). Frontend je vyrovnávač zatížení (Kemp LoadMaster 3000) a web běží na Tomcat (8.5.54). Abych zjistil příčinu tohoto problému, provozuji za vyrovnávačem zatížení pouze jednu instanci Tomcat, abych měl jednodušší systém. Každá stránka na webu (veřejné stránky a stránky viděné po ověření) běží pod HTTPS.

Následující zjednodušený kód ukazuje, jak problém demonstrovat:

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

Časový limit relace na vyrovnávači zátěže je 60 minut a jeho trvalý režim je

Super HTTP and Source IP

Časový limit relace na serveru Tomcat je také 60 minut zadán v souboru web.xml

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

Následuje související nastavení v 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>

Zde jsou moje pozorování ohledně ID relace a dat relace v metodě POST. Pro velké procento časů metoda POST vytiskne stejné ID relace a hodnotu tokenu, pokud k odeslání dojde do 60 minut po zobrazení formuláře. To je pochopitelné. Nerozumím tomu, že ve velmi malém procentu případů, ve kterých k odeslání formuláře dochází před 60minutovým limitem, se ID relace změní A hodnota tokenu je null nebo ID relace zůstává stejné, ale hodnota tokenu je null .

Jak mohu zabránit změně ID relace a ztrátě dat relace, pokud relace nevyprší? Opravdu to potřebuji, protože web funguje. Strávil jsem hodně času online za možnou opravu a provedl mnoho různých testů (včetně přidání kódu, abych vyloučil možnost, že problém je způsoben spamem nebo útokem), ale žádný úspěch.

Prosím, neváhejte a dejte mi vědět, pokud potřebujete více informací o webu.

Položena 07/06/2020 v 17:53
zdroj uživatelem
V jiných jazycích...                            

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