In diesem Artikel wird hauptsächlich die Verwendung von Sitzungshörungen in Java eingeführt, um Anmeldeinschränkungen und Anzahl der Anmeldungen für dasselbe Konto zu erzielen. Der spezifische Code lautet wie folgt:
Problemdomäne:
1. Melden Sie sich mit demselben Konto an: Wenn dieses Konto bereits angemeldet ist, können Sie sich nicht erneut anmelden (das Gegenteil zum QQ -Modus).
2. Wenn die Anzahl der angemeldeten Einschaltungen begrenzt ist, wenn die Anzahl der Personen überschreitet oder erreicht wurde, ist die Eingabeaufforderung: Das System ist besetzt, versuchen Sie es später erneut.
Lösung: Verwenden Sie den HttpSessionAttributelistener -Hörer (obwohl ich den httpSessionListener gleichzeitig verwendet habe, fühlt es sich schwierig an, zu bedienen).
Knowledge Reserve: HttpSessionAttributelistener hat drei Methoden: Attributeadd, AttributerEmove und AttributerePlace.
Die SetAtTribute und die RemoveTtribute der Sitzung lösen die Methoden für Attributeadd- und Attributteremove aus. Wiederholte Einstellungen desselben Attributs derselben Sitzung auslösen die AttributerePlace -Methode.
Der Grund, warum httpSessionListener schwierig zu bedienen ist: Solange Sie auf die JSP -Seite zugreifen, erstellen Sie eine Sitzung (Sie erstellen keine Sitzung, wenn Sie auf die HTML -Seite zugreifen. Auf der Serverseite, beispielsweise, wenn Sie httpServletRequest.getSession (true) im Servlet anrufen, erstellen Sie es. JSP ist eine dynamische Seite und im Wesentlichen ein Servlet. Mein Login.jsp ist offensichtlich ein JSP. Wenn ich eine Sitzung im Hörer ungültig machen und zur Anmeldeseite zurückkehre, habe ich sofort eine weitere Sitzung erstellt. Das ist etwas, worüber ich nicht klar bin, und ich bin nicht von meinen Fähigkeiten nach Hause gekommen.
Spezifische Implementierung:
Hörercode
öffentliche Klasse Onlinelistener implementiert httpSessionListener, httpSessionAttributelistener {private statische Liste <Sesionanduser> Sessions; static int dels = -1; statische Boolesche Flagge = Falsch; static {if (sissions == null) {sissions = collections .synchronizedList (new ArrayList <Sesionandususer> ()); }} public void sessioncreated (httpSessionEvent HSE) {System.out.println (hse.getSession () + "-" + New Date ()); System.out.println (hse.getSession () + "-" + new Date ()); } public void sessionDestroyed (httpSessionEvent HSE) {System.out.println ("------------- SessionDestroyed () -----------"); System.out.println (hse.getSession () + "" + neues Datum (HSE.GetSession (). GetLastAccessTime ())); System.out.println (hse.getSession () + "" + neues Datum ()); } public void attributeadded (httpSessionBindingEvent e) {System.out.println ("-----------------*Start hinzugefügt*-----------------------" + siss.size ()); HttpSession session = e.getSession (); ActionContext ctx = actionContext.getContext (); boolean newone = true; String attrName = e.getName (); // Anmeldung if (attrName.equals (constant.user_name)) {// Überprüfen Sie die Anzahl der Anmeldungen if (Sitzungen.size ()> = constant.user_limit) {newone = false; ctx.put ("timeoutmsg", "serverbusy"); } String nowuser = (string) e.getValue (); // Alle Sitzungen durchqueren, um zu prüfen, ob Sie sich angemeldet haben. Wenn ja, fordert es auf, dass Sie sich für (int i = sissions.size ()-1; i> = 0; i--) {sessionanduser tem = sessions.get (i); if (tem.getUnername (). Equals (nowuser)) {newone = false; ctx.put ("timeoutmsg", "wa gewesen"); // tem.getSession (). Invalidate (); // // Melden Sie sich mit demselben Konto an und rufen Sie automatisch REMET REMET PEAM an. }} // Fügen Sie das neue Anmeldekonto zur Liste der Kontowartung hinzu, wenn (Newone) {sessionanduser sau = new Sessionanduser (); sau.setusername (nowuser); Sau.SetSession (Sitzung); Sau.Setsid (Session.getId ()); Sitzungen.Add (SAU); }}} public void AttruterMoved (httpSessionBindingEvent e) löscht IllegalStateException {httpSession Session = E.GetSession (); System.out .println ("------------- if (dels> -1) {if (flag) {sissions.remove (dels); Flag = Falsch; }} else {// 登录 String attrName = e.getName (); if (attrName.equals (constant.user_name)) {String nowuser = (string) e.getValue (); // Alle Sitzungen für (int i = sissions.size ()-1; i> = 0; i--) {sessionanduser tem = sissions.get (i); if (tem.getUnername (). Equals (nowuser)) {sissions.remove (i); brechen; }}}}} public void attributePlate (httpSessionBindingEvent e) {httpSession Session = E.GetSession (); System.out .println ("----------------- String attrName = e.getName (); Dels = -1; // 登录 if (attrName.equals (constant.user_name)) {// user nowuser = (user) e.getValue (); // alter Wert String nowuser = (String) Sitzung tem = sessions.get (i); if (tem.getUnername (). Equals (nowuser) &&! tem.getsid (). Equals (session.getId ()) {System.out.println ("entfernen: ungültig 1!"); dels = i; Flag = wahr; } else if (tem.getSID (). Equals (Session.getId ()) {tem.setusername (nowuser); }} if (dels! Es wird auch aus den Sitzungen entfernt}}}} Die Hauptidee des Code besteht darin, eine statische Liste <SesionAnduser> zu definieren, um Sitzungs- und Kontonamen zu speichern.
Der Code, der den Rückgabewert des Listeners zurückbringt und ihn in der angemeldeten Aktion verarbeitet
Session.SetAttribute (constant.user_name, operator.getUnername ()); ActionContext ctx = actionContext.getContext (); if ("serverbusy" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "Der Server ist beschäftigt, versuchen Sie es später erneut"); zurück "springen"; } if ("wasloged" .equals (ctx.get ("timeoutmsg"))) {ctx.put ("timeoutmsg", "Dieses Konto ist an anderer Stelle angemeldet"); zurück "springen"; } Eingabeaufforderungscode von Seite erfassen
<%@taglib prefix = "s" uri = " /struts-tags"%> <s: Eigenschaftswert = "#attr.timeoutmsg" />
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!