Spring MVC, Spring Security und Tomcat: Sitzungs-ID geändert und Sitzungsdaten verloren

stimmen
16

Die Website, die ich unterstütze, wurde mit Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP und Hibernate (4.3.8.Final) entwickelt. Das Frontend ist ein Load Balancer (Kemp LoadMaster 3000) und die Site läuft auf Tomcat (8.5.54). Um die Ursache für dieses Problem zu finden, lasse ich nur eine Tomcat-Instanz hinter dem Load Balancer laufen, um ein einfacheres System zu haben. Jede Seite auf der Website (öffentliche Seiten und die Seiten, die nach der Authentifizierung angezeigt werden) läuft unter HTTPS.

Der folgende vereinfachte Code zeigt, wie das Problem demonstriert werden kann:

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

Das Sitzungs-Timeout auf dem Load Balancer beträgt 60 Minuten, und sein persistenter Modus ist

Super HTTP and Source IP

Das Sitzungs-Timeout auf Tomcat beträgt ebenfalls 60 Minuten, die in web.xml angegeben sind

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

Im Folgenden finden Sie die entsprechende Einrichtung 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>

Hier sind meine Beobachtungen über die Sitzungs-ID und Sitzungsdaten in der POST-Methode. Die POST-Methode gibt in einem großen Prozentsatz der Fälle dieselbe Sitzungs-ID und denselben Token-Wert aus, wenn die Einreichung innerhalb von 60 Minuten nach der Anzeige des Formulars erfolgt. Dies ist verständlich. Was ich nicht verstehe, ist, dass für einen sehr kleinen Prozentsatz der Fälle, in denen die Einreichung des Formulars vor der 60-Minuten-Grenze erfolgt, die Sitzungs-ID sich ändert UND der Token-Wert null ist oder die Sitzungs-ID gleich bleibt, ABER der Token-Wert ist null

Wie kann ich verhindern, dass sich die Sitzungskennung ändert und Sitzungsdaten verloren gehen, wenn eine Sitzung nicht ausläuft? Ich brauche das wirklich, weil die Website so funktioniert. Ich verbringe viel Zeit online für eine mögliche Korrektur und habe viele und verschiedene Tests durchgeführt (einschließlich des Hinzufügens von Code, um die Möglichkeit auszuschließen, dass das Problem durch Spam oder einen Angriff verursacht wird), aber ohne Erfolg

Bitte zögern Sie nicht, mir mitzuteilen, wenn Sie weitere Informationen über die Website benötigen.

Veröffentlicht am 07/06/2020 um 17:53
quelle vom benutzer
In anderen Sprachen...                            

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