Spring MVC, Spring Security og Tomcat: endret økt-ID og mistet øktdata

stemmer
16

Nettstedet jeg støtter ble utviklet med Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP og Hibernate (4.3.8.Final). Frontenden er en lastbalanser (Kemp LoadMaster 3000) og nettstedet går på Tomcat (8.5.54). For å finne årsaken til dette problemet, kjører jeg bare en Tomcat-instans bak lastbalansen for å ha et enklere system. Hver side på nettstedet (offentlige sider og sidene sett etter autentisering) kjøres under HTTPS.

Følgende forenklet kode viser hvordan du kan demonstrere problemet:

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

Øktavbrudd på belastningsbalansen er 60 minutter, og dens vedvarende modus er

Super HTTP and Source IP

Øktperioden på Tomcat er også 60 minutter spesifisert i web.xml

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

Følgende er det relaterte oppsettet i 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>

Her er mine observasjoner om økt-ID og sesjonsdata i POST-metoden. I en stor prosentandel av gangene skriver POST-metoden ut den samme økten-ID og tokenverdi hvis innsendingen skjer innen 60 minutter etter at skjemaet ble vist. Dette er forståelig. Det jeg ikke forstår, er at for en veldig liten prosentandel av tilfellene der skjemainnleveringen skjer før 60-minuttsgrensen, økes sesjons-IDEN OG tokenverdien er null eller sesjons-IDen forblir den samme MEN tokenverdien er null .

Hvordan kan jeg forhindre at økt-ID endres og økt av data fra tap hvis en økt ikke går ut? Jeg trenger virkelig dette på grunn av hvordan nettstedet fungerer. Jeg bruker mye tid på nettet for en mulig løsning og gjorde mange og forskjellige tester (inkludert å legge til kode for å utelukke muligheten for at problemet skyldes spam eller angrep), men ingen suksess.

Gi meg beskjed hvis du trenger mer info om nettstedet.

Publisert på 07/06/2020 klokken 17:53
kilden bruker
På andre språk...                            

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