2013-10-23 12 views
7

Ich bin neu im Frühling Sicherheit und Verwendung für die Authentifizierung. Ich stehe vor einem Problem, dass die Sitzung abläuft, wenn der Browser geschlossen wird oder wenn ein ungewöhnlicher Fehler auftritt. Ich kann das Ereignis jedoch nicht abfangen, um den Bereinigungscode auszuführen. Ich erkunde darüber und fand HttpSessionEventPublisher im Frühjahr, um HttpSessionDestroyedEvent in sessionDestroyed() Methode zu erfassen, aber das wird nicht aufgerufen, wenn ich den Browser schließe.Listener für Session Expiration im Frühjahr

Antrag, Lösung für das selbe vorzuschlagen.

+0

Ich habe eine Lösung hinzugefügt. Hoffe das hilft und lass es mich wissen. –

Antwort

1

Vielleicht SessionManagementFilter könnte helfen?

Oder Sie können Spring Security so konfigurieren, dass Benutzer automatisch umgeleitet wird, wenn eine Zeitüberschreitung aufgetreten ist: Detecting timeouts Abschnitt.

+0

SessionManagementFilter wird mir helfen, jede Anfrage zu verfolgen und zu authentifizieren, aber beim Schließen des Browsers wird keine solche Anfrage an den Server gesendet. – Prashant

0

Sie müssen den Listener in der web.xml registrieren!

<listener> 
     <listener-class> 
      org.springframework.security.web.session.HttpSessionEventPublisher 
     </listener-class> 
</listener> 

Aber natürlich, dass es nur erkennen, die Sitzung (wegen einer Zeitüberschreitung oder eine expliziten programmatischen Sitzung zerstören) geschlossen ist, aber es nicht erkennt, dass jemand seinen Browser schließen. Dies liegt daran, dass es keine HTTP-Benachrichtigung über einen geschlossenen Browser gibt.

-3

Sie können das JQuery den Browser zu schließen Problem lösen,

Die JQuery wird,

$(window).on('beforeunload', function(){ 
    return 'Are you sure you want to leave?'; 
}); 

$(window).on('unload', function(){ 
    //alert("unload"); 
    $.ajax({ 
     type: "POST", 
     url: "Logout.html", 
     //data: "message=" + message, 
     dataType: "html", 

     success: function(response) { 

     }, 
     error: function(e) { 
      //alert('Error: ' + e); 
     } 
    }); 
}); 

In Frühling Controller,

@RequestMapping(value="Logout.html",method=RequestMethod.POST) 
public @ResponseBody String logout(HttpSession session){ 

    System.out.println("Request Logout"); 

    // Do you work before invalidate the session 

    session.invalidate(); 

} 

In web.xm l dieses Add, wenn Sie HttpSessionEventPublisher verwendet die Sitzung zu fangen Ereignis zu zerstören,

<listener> 
     <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
     </listener-class> 
</listener> 

Hoffnung, das hilft.

+0

Ich habe das nicht versucht, aber was passiert, wenn Javascript deaktiviert ist oder wenn das System abstürzt. – Prashant

+0

JavaScript muss aktiviert sein. Heute gibt es keine Webanwendung ohne JavaScript. –

+0

@HyperLink Kann dies auch mit nur JQuery ohne Ajax gemacht werden, da unser System nur gerade Spring MVC mit direkter Client-Kommunikation verwendet? Vielen Dank. –