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.