Spring MVC, Spring Security και Tomcat: άλλαξε το αναγνωριστικό περιόδου σύνδεσης και χάθηκαν δεδομένα περιόδου σύνδεσης

ψήφοι
29

Ο ιστότοπος που υποστηρίζω αναπτύχθηκε με Spring MVC (4.2.9.RELEASE), Spring Security (3.2.5.RELEASE), JSP και Hibernate (4.3.8.Final). Το frontend είναι ένα εξισορροπητικό φορτίου (Kemp LoadMaster 3000) και ο ιστότοπος λειτουργεί στο Tomcat (8.5.54). Προκειμένου να βρω την αιτία αυτού του ζητήματος, τρέχω μόνο μία παρουσία Tomcat πίσω από τον εξισορροπητή φόρτωσης για να έχω ένα απλούστερο σύστημα. Κάθε σελίδα στον ιστότοπο (δημόσιες σελίδες και οι σελίδες που εμφανίζονται μετά τον έλεγχο ταυτότητας) εκτελείται στο HTTPS.

Ο παρακάτω απλοποιημένος κώδικας δείχνει πώς να επιδείξετε το ζήτημα:

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

Το χρονικό όριο περιόδου λειτουργίας στον εξισορροπητή φόρτωσης είναι 60 λεπτά και η μόνιμη λειτουργία του είναι

Super HTTP and Source IP

Το χρονικό όριο περιόδου λειτουργίας στο Tomcat καθορίζεται επίσης 60 λεπτά στο web.xml

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

Το παρακάτω είναι η σχετική ρύθμιση στο 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>

Ακολουθούν οι παρατηρήσεις μου σχετικά με το αναγνωριστικό περιόδου σύνδεσης και τα δεδομένα περιόδου σύνδεσης στη μέθοδο POST. Για ένα μεγάλο ποσοστό των φορών, η μέθοδος POST εκτυπώνει το ίδιο αναγνωριστικό περιόδου σύνδεσης και την τιμή του διακριτικού εάν η υποβολή πραγματοποιείται εντός 60 λεπτών από την εμφάνιση της φόρμας. Αυτό είναι κατανοητό. Αυτό που δεν καταλαβαίνω είναι ότι για ένα πολύ μικρό ποσοστό περιπτώσεων στις οποίες η υποβολή της φόρμας πραγματοποιείται πριν από το όριο των 60 λεπτών, το αναγνωριστικό περιόδου σύνδεσης αλλάζει και η τιμή του διακριτικού είναι μηδενική ή το αναγνωριστικό περιόδου σύνδεσης παραμένει το ίδιο ΑΛΛΑ η τιμή του διακριτικού είναι μηδενική .

Πώς μπορώ να αποτρέψω την αλλαγή του αναγνωριστικού περιόδου σύνδεσης και την απώλεια δεδομένων περιόδου σύνδεσης, εάν μια περίοδος λειτουργίας δεν λήξει; Το χρειάζομαι πραγματικά λόγω του τρόπου λειτουργίας του ιστότοπου. Ξοδεύω πολύ χρόνο στο διαδίκτυο για μια πιθανή επιδιόρθωση και έκανα πολλές και διάφορες δοκιμές (συμπεριλαμβανομένης της προσθήκης κώδικα για να αποκλείσω την πιθανότητα ότι το ζήτημα προκαλείται από ανεπιθύμητο περιεχόμενο ή επίθεση), αλλά δεν έχει επιτυχία.

Μη διστάσετε να με ενημερώσετε αν χρειάζεστε περισσότερες πληροφορίες σχετικά με τον ιστότοπο.

Δημοσιεύθηκε 07/06/2020 στις 17:53
πηγή χρήστη
Σε άλλες γλώσσες...                            

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