Spring MVC, Spring Security i Tomcat: zmiana ID sesji i utrata danych sesji

głosy
31

Strona, którą wspieram została stworzona z wykorzystaniem Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP, oraz Hibernate (4.3.8.Final). Frontend to load balancer (Kemp LoadMaster 3000), a plac budowy jest prowadzony na Tomcat (8.5.54). Aby znaleźć przyczynę tego problemu, uruchamiam tylko jedną instancję Tomcata za urządzeniem LoadMaster, aby mieć prostszy system. Każda strona w serwisie (strony publiczne i strony widziane po uwierzytelnieniu) działa pod HTTPS.

Poniższy uproszczony kod pokazuje jak zademonstrować ten problem:

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

Timeout sesji na load balancerze wynosi 60 minut, a jego tryb trwały to

Super HTTP and Source IP

Czas trwania sesji na Tomcacie wynosi również 60 minut określonych w web.xml

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

Poniżej znajduje się powiązana konfiguracja w 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>

Oto moje obserwacje dotyczące identyfikatora sesji i danych sesji w metodzie POST. W dużym procencie przypadków metoda POST drukuje ten sam identyfikator sesji i wartość tokena, jeżeli zgłoszenie ma miejsce w ciągu 60 minut od wyświetlenia formularza. Jest to zrozumiałe. Nie rozumiem tylko, że w bardzo małym procencie przypadków, w których wysyłka formularza odbywa się przed upływem 60 minut, ID sesji zmienia się, a wartość tokena jest zerowa lub ID sesji pozostaje takie samo, ALE wartość tokena jest zerowa

Jak mogę zapobiec zmianie identyfikatora sesji i utracie danych sesji, jeśli sesja nie zostanie przerwana? Naprawdę potrzebuję tego ze względu na sposób działania strony. Spędzam dużo czasu online na ewentualnej naprawie i robię wiele różnych testów (w tym dodawanie kodu, aby wykluczyć możliwość, że problem jest spowodowany przez spam lub atak), ale bez powodzenia

Proszę dać mi znać, jeśli potrzebujesz więcej informacji na temat strony.

Utwórz 07/06/2020 o 17:53
źródło użytkownik
W innych językach...                            

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