Spring MVC, Spring Security și Tomcat: au modificat ID-ul sesiunii și au pierdut datele sesiunii

voturi
29

Site-ul pe care îl susțin a fost dezvoltat cu Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP și Hibernate (4.3.8.Final). Frontend-ul este un echilibrator de sarcină (Kemp LoadMaster 3000), iar site-ul rulează pe Tomcat (8.5.54). Pentru a găsi cauza acestei probleme, rulez o singură instanță Tomcat în spatele echilibrului de sarcină pentru a avea un sistem mai simplu. Fiecare pagină de pe site (paginile publice și paginile văzute după autentificare) rulează sub HTTPS.

Următorul cod simplificat arată cum să demonstrezi 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;
}

Durata de expunere a sesiunii pe echilibratorul de sarcină este de 60 de minute, iar modul său persistent este

Super HTTP and Source IP

Timeout-ul sesiunii pe Tomcat este, de asemenea, specificat în 60 de minute în web.xml

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

Următoarea este configurarea aferentă în 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>

Iată observațiile mele despre ID-ul și datele sesiunii din metoda POST. Pentru un procent mare de ori, metoda POST tipărește același ID de ședință și valoarea de jeton dacă trimiterea are loc în termen de 60 de minute de la afișarea formularului. Acest lucru este de înțeles. Nu înțeleg este faptul că pentru un procent foarte mic de cazuri în care trimiterea formularului se întâmplă înainte de limita de 60 de minute, ID-ul sesiunii se schimbă, iar valoarea jetonului este nulă sau ID-ul sesiunii rămâne același DAR valoarea jetonului este nulă .

Cum pot împiedica schimbarea datelor de sesiune și pierderea datelor sesiunii dacă nu se termină o sesiune? Chiar am nevoie de asta datorită modului în care funcționează site-ul. Petrec mult timp online pentru o posibilă rezolvare și am făcut multe și diferite teste (inclusiv adăugarea codului pentru a exclude posibilitatea ca problema să fie cauzată de spam sau atac), dar fără succes.

Vă rugăm să nu ezitați să mă anunțați dacă aveți nevoie de mai multe informații despre site.

Întrebat 07/06/2020 la 17:53
sursa de către utilizator
În alte limbi...                            

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