2017-12-07 9 views
-3

Mein Szenario ist, gibt es zwei verschiedene Benutzer anmelden mit der gleichen Benutzer-ID und password.mean Zeit einer der Person ändern Sie das Passwort, indem Sie das aktuelle Passwort. Und änderte das Passwort zur gleichen Zeit, die ein anderer Benutzer gibt das aktuelle Passwort, was er falsch eingeloggt war. Also ich möchte Logout von allen anderen Geräten in meiner Web-Anwendung hinzufügen. Wie kann ich das tunSo fügen Sie Abmelden von allen anderen Sitzung

+1

Willkommen bei SO! Bitte lesen Sie [Wie Sie fragen] (https://stackoverflow.com/help/how-to-ask) und [Wie erstelle ich ein Minimal, vollständig und verifizierbar] (https://stackoverflow.com/help/mcve) Beispiel, und aktualisieren Sie Ihre Frage dann. Kurz gesagt: schreibe keinen Aufsatz, in dem du erklärst, was du tun willst, ** zeige stattdessen deinen Code ** (was hast du bisher versucht). –

+0

Aber das Szenario muss ich erklären .. und ich habe keine Ahnung, wie man das macht – Jagadish

+1

Sie müssen den Code teilen. Wenn nicht, können Sie teilen, wie Sie eine Sitzung erstellen, wo Sie Daten speichern usw. – Preet

Antwort

0

Es gibt natürlich mehr als einen Ansatz, meine erste Idee wäre, die Sitzungen an die ServletContext zu haken. So etwas wie

// this can be in some util class, let's call it SessionUtil 
static final String SESSION_REGISTER = "session.register"; 
public static synchronized void registerSession(ServletRequest req, HttpSession ses, String userName) { 
    ServletContext ctx = req.getServletContext(); 
    Map<String, List<HttpSession>> register = (Map<String, List<HttpSession>>) ctx.getAttribute(SESSION_REGISTER); 
    if (register == null) { 
    register = new HashMap<>(); 
    ctx.setAttribute(SESSION_REGISTER, register); 
    } 
    List<HttpSession> sessions = register.computeIfAbsent(userName, k -> new ArrayList<>()); 
    sessions.add(ses); 
} 

Dann in Ihrem Code, müssen Sie die Sitzung des Benutzers nach dem Login registrieren:

HttpSession ss = request.getSession(); 
if (isUser(name,password)) { 
    ss.setAttribute("user",name) 
    SessionUtil.registerSession(request, ss, name); 
} 

Schließlich müssen Sie eine Methode (wieder in SessionUtil Klasse) die alle Benutzer entkräften Sitzungen (außer dem aktuellen):

public static synchronized void invalidateSessions(ServletRequest req, HttpSession current, String userName) { 
    ServletContext ctx = req.getServletContext(); 
    Map<String, List<HttpSession>> register = (Map<String, List<HttpSession>>) ctx.getAttribute(SESSION_REGISTER); 
    if (register != null) { 
    List<HttpSession> sessions = register.get(userName); 
    if (sessions != null) { 
     for (HttpSession ses : sessions) { 
     if (!ses.equals(current)) { 
      ses.invalidate(); 
     } 
     } 
    } 
    } 
} 

Dann können Sie diese Methode zB aufrufen wenn der Benutzer sein Passwort ändert.

Hinweis # 1: Nicht ein sehr netter Code, es vermisst einige Plausibilitätschecks und synchronized kann kleinere Stücke Code sein. Es ist nur, um dir eine Idee zu geben.

Hinweis # 2: Die Funktionalität der registerSession(...) Methode kann die HttpSessionAttributeListener verwendet getan werden, aber ich habe es noch nie benutzt, so kann nicht ein Beispiel geben.

+0

vielen Dank .. es funktioniert – Jagadish

Verwandte Themen