Spring MVC, Spring Security e Tomcat: modifica dell'ID della sessione e perdita dei dati della sessione

voti
16

Il sito web che sto supportando è stato sviluppato con Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP, e Hibernate (4.3.8.Final). Il frontend è un bilanciatore di carico (Kemp LoadMaster 3000) e il sito funziona su Tomcat (8.5.54). Per trovare la causa di questo problema, sto eseguendo una sola istanza di Tomcat dietro il bilanciatore di carico per avere un sistema più semplice. Ogni pagina del sito (pagine pubbliche e le pagine viste dopo l'autenticazione) gira sotto HTTPS.

Il seguente codice semplificato mostra come dimostrare il 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;
}

Il timeout della sessione sul bilanciatore di carico è di 60 minuti e la sua modalità persistente è

Super HTTP and Source IP

Anche il timeout di sessione su Tomcat è di 60 minuti specificato in web.xml

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

Di seguito è riportato il relativo 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>

Ecco le mie osservazioni sull'ID della sessione e sui dati della sessione nel metodo POST. Per una grande percentuale di volte, il metodo POST stampa lo stesso ID di sessione e lo stesso valore del token se l'invio avviene entro 60 minuti dalla visualizzazione del modulo. Questo è comprensibile. Quello che non capisco è che per una piccolissima percentuale di casi in cui l'invio del modulo avviene prima del limite dei 60 minuti, l'ID di sessione cambia E il valore del token è nullo o l'ID di sessione rimane lo stesso MA il valore del token è nullo

Come posso evitare che l'ID della sessione cambi e che i dati della sessione vadano persi se una sessione non va in time out? Ne ho davvero bisogno per come funziona il sito. Passo molto tempo online per una possibile correzione e ho fatto molti e vari test (tra cui l'aggiunta di codice per escludere la possibilità che il problema sia causato da spam o attacchi), ma nessun successo

Non esitate a farmi sapere se avete bisogno di ulteriori informazioni sul sito.

È pubblicato 07/06/2020 alle 17:53
fonte dall'utente
In altre lingue...                            

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