Para una cuenta que solo puede iniciar sesión en una persona al mismo tiempo, se puede lograr mediante el siguiente método:
1. Agregue el usuario a una lista de matrices cuando el usuario inicie sesión
2. Al iniciar sesión nuevamente, verifique si hay algún usuario en ArrayList. Si el usuario ya existe en ArrayList, se bloqueará para iniciar sesión.
3. Cuando el usuario sale, el usuario necesita ser eliminado de la ArrayList, que se divide en tres situaciones
① Use el botón de inicio de sesión para salir normalmente
② Haga clic en el botón Cerrar del navegador o use Alt+F4 para salir, y puede usar JavaScript para capturar el evento de cierre de la página.
Ejecutar un método Java para eliminar a los usuarios en ArrayList
③ Inicio de sesión inusual, como un bloqueo o un bloqueo repentino en el sistema del cliente, puede usar el usuario correspondiente a la sesión para eliminar la sesión si la sesión no está activa de vez en cuando, por lo que el usuario debe esperar un tiempo antes de iniciar sesión normalmente.
Definido en Loginaction:
// Se utiliza para almacenar todas las cuentas que se registran en la lista estática pública del lado del servidor LogonAccounts;
Método de inicio de sesión de inicio de sesión ():
// Establezca el tiempo de inactividad de la sesión en 30 minutos request.getSession (). SetMaxInActiveInterval (60*30); if (LogonAccounts == null) {LogonAccounts = new ArrayList ();} // Compruebe si hay algún usuario en ArrayList para (int i = 0; i <logonacCounts.size (); i ++) (Cuenta) LogonAccounts.get (i); if (Account.GetAccountId (). Equals (ExistAccount.GetAccountId ())) {return "denegado";}} // Cuando el usuario inicia sesión, agregue SessionId a un objeto de cuenta // más adelante ③ Debe eliminar la cuenta del usuario correspondiente. LogonAccounts.Add (cuenta); devolver "Iniciar sesión";① Use el botón de inicio de sesión para salir normalmente
Método de salida de logrout ():
if (LogonAccounts == null) {LogonAccounts = new ArrayList ();} // Elimine el usuario en ArrayList ⑴ para (int i = 0; i <logonaccounts.size (); i ++) {cuenta existentecount = (cuenta) logonaccounts.get (i); if (cuenta.getAccountId (). Equals (Existaccount.GetAccountId ())) {LogonAccounts.Remove (cuenta);}}② Haga clic en el botón Cerrar del navegador o use Alt+F4 para salir:
Una ventana aparece en segundo plano, elimina al usuario en la lista de matrices en la ventana emergente
función window.onbeforeunload () {// Si se debe salir a través del botón Cerrar o usar Alt+F4 // Si el evento OnbeforeNoNload se activa para actualizar, la siguiente instrucción si no se ejecuta si (event.clientx> document.body.clientwidth && Event.clienty <0 || Event.altkey) {Window.open ('AccountUnBound.jsp', '', 'Height = 0, Width = 0, Top = 10000, Left = 10000');}}AccountUnBound.jsp: Elimine al usuario en ArrayList en la ventana emergente
<%Cuenta de cuenta = (cuenta) request.getSession (). GetAttribute ("cuenta"); if (cuenta! = Null) {if (loginAction.LoGonAccounts == null) {loginaction.logonacCounts = LogonAccounts.size ();Para asegurarse de que el código anterior se pueda ejecutar, cierre esta ventana emergente después de 3 segundos (también ubicado en AccountunBound.jsp)
<script> setTimeOut ("CloseWindow ();", 3000); function CloseWindow () {Window.Close ();} </script>③ Haga que LoginAction implementa httpsessionListener e implemente métodos de sessioncreated y sessionedestroyed. Eliminar usuarios en ArrayList en SessionDestroyed (si el usuario está inactivo durante más de 30 minutos, este método se ejecutará)
public void sessionDestroyed (evento httpsessionEvent) {// Obtenga el SessionID cuando está inactivo y elimine al usuario en la cadena de LogonAccounts correspondiente sessionId = event.getSession (). getId (); para (int i = 0; i <logonaccounts.size (); i ++) {cuenta existaccount = (cuenta) logonAccounts.get (i); if (cuenta.getSessionId (). Equals (Existaccount.getSessionId ())) {LogonAccounts.Remove (cuenta);}}}Nota:
Para lo anterior, dado que la ventana emergente está fácilmente bloqueada por el firewall o el software de seguridad, la ventana emergente no se puede aparecer y, por lo tanto, el inicio de sesión a corto plazo no se puede registrar. En este caso, Ajax se puede usar en lugar de la ventana emergente. El código que elimina al usuario en segundo plano se ejecuta, pero no estará restringido por el firewall:
<script> // <! [CDATA [var http_request = false; function makeRequest (url) {http_request = false; if (window.xmlhttprequest) {// mozilla, safari, ... http_request = new xmlhttprequest (); if (http_request) {http_request.overridEmeMeType ('text/xml');}} else if (window.activexoBject) {// ietry {http_request = new ActiveXoBject ("msxml2.xmlhttp");} catch (e) {intit {http_request = new new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}}}if (!http_request) {alert('Giving up :( Cannot create an XMLHTTP instance');return false;}http_request.onreadystatechange = alertContents;http_request.open('GET', url, verdadero); http_request.send (null);} function alertcontents () {if (http_request.readystate == 4) {if (http_request.status == 200) {window.close ();} else {alerta ('hubo un problema con la solicitud. {Makerequest ('AccountUnBound.jsp');} //]]> </script> Hay muchas explicaciones detalladas para el código AJAX anterior en Internet. Agregarlo al evento de cierre del navegador OnbeforeUnload () funcionará muy bien en segundo plano, por lo que no hay necesidad de preocuparse por el problema de que las ventanas emergentes a veces no serán válidas.
Después de usar este código, el código JS en AccountUnBound.jsp en el anterior ② cierra la ventana emergente. ya no es necesario.
Lo anterior es la implementación web de Java de la función de inicio de sesión QQ que el editor le presenta. Una cuenta solo puede iniciar sesión en una persona al mismo tiempo. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!