La función de inicio de sesión único sigue siendo muy importante en los escenarios de aplicación reales. Lógicamente, no permitimos que un usuario realice dos operaciones al mismo tiempo. Aprendamos sobre la implementación de inicio de sesión único de SpringMVC.
El interceptor de SpringMVC es diferente del interceptor de Spring. SpringMVC tiene una entrada unificada despachadores. Todas las solicitudes pasan a través de DispatcherServlet, por lo que solo necesita hacer un escándalo en el despachador. El desplazamiento no tiene un proxy, y el controlador administrado por SpringMVC no tiene un proxy.
1. Primero explore un principio de implementación básica: esta función es relativamente simple, es decir, solo un usuario puede operar en el mismo proyecto web al mismo tiempo, por lo que aquí está el descubrimiento de un inicio de sesión remoto y se introducen dos rutas aquí. 1. El servidor descubre que el usuario registrado ha realizado nuevamente la operación de inicio de sesión a través de otra IP, y luego presiona activamente un recordatorio para decirle al primer usuario que inicie sesión en el inicio de sesión remoto; 2. Cuando el usuario realiza operaciones, encuentra que su cuenta ha sido exprimida y hay un inicio de sesión remoto. Con respecto a estas dos soluciones, la primera es más en tiempo real, pero aún se está explorando. Centrémonos en el segundo método a continuación.
2. Implementar el segundo tipo es relativamente simple. Hay dos operaciones. Una es agregar un campo adicional al SessionID del usuario para almacenar el SessionID del usuario iniciado, porque cada solicitud de solicitud corresponde a un SessionId no repetitivo único. Luego, utilizando la tecnología de interceptor, interceptando las operaciones del usuario. En el interceptor, la solicitud de URL relevante en la página de inicio de sesión se publica por primera vez, y la otra es la solicitud de verificación de inicio de sesión. Finalmente, filtre al usuario. (Sobre el inicio de sesión del usuario, cuando la verificación es exitosa, no solo el usuario debe almacenarse en la sesión para la verificación de intercepción de inicio de sesión, sino que también la ID de sesión debe almacenarse en el SessionID correspondiente en la tabla del usuario). Para la solicitud de solicitud esta vez, puede obtener la sesión y su ID y luego comparar si lo mismo con la sesión de sesión en la base de datos de acuerdo con esta ID y luego aprobar el comunicado. Si la diferencia es, se solicitará al inicio de sesión de salto fuera de línea que salte al inicio de sesión, porque habrá una sesión en la operación de un servidor de conexión de usuario. Mientras la sesión expire, la ID de sesión de cada operación iniciada por el usuario es la misma, por lo que coincidirá con la ID almacenada en la base de datos al iniciar sesión. Cuando alguien más atraviese otros dispositivos, use la misma cuenta para ingresar. La sesión se restablecerá al iniciar sesión. La sesión en la base de datos actualizará el SessionID en la base de datos, pero el SessionID aún no cambia. Sin embargo, la sesión en la base de datos ha cambiado. Por lo tanto, al verificar si la sesión de sesión en la base de datos es consistente en el interceptor, no interceptará la operación del usuario para lograr la función del inicio de sesión de un solo usuario. (Una nota sobre la sesión, cuando el usuario se conecta por primera vez al servidor, se creará una sesión en el lado del servidor, y luego cada operación iniciada por el usuario llevará la identificación de esta sesión, y algunas situaciones ocurrirán. El usuario no ha operado con el servidor durante mucho tiempo. El usuario no se puede hacer inyectar y hacer que la sesión sea inválida.
La siguiente es la implementación del interceptor en SpringMVC
Public Class SingleUserInterceptor implementa HandlerInterceptor {@aUtowiredPrivate Usermapper Mapper; public void AfterComppletion (httpservletRequest arg0, httpservletResponse Arg1, arg1 de excepción, httpserveRet arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, arg0, tortos de arg0, horttseRTLEntle (httpsEntpsquest arg. HttpServletResponse Arg1, Object Arg2, ModelAndView Arg3) lanza la excepción {// tODO Auto Generated Method Stub} public boolean PreHandle (httpservletRequest arg0, httpServletResponse Arg1, Object arg2) lanza la excepción {string url = arg0.getReSquesturi (); // if the log la página de registro de la excepción, la excepción {arg0. arg0.getReSquesturi (); // if la página de registro de logged, la página de transmisión de la sesión de la registro de la registro, la apertura de la sesión de la registro. if (url.indexof ("login.jsp")> = 0 || url.indexof ("new/login")> = 0 || url.indexof ("checkUser")> = 0) {return true;} // Si el nombre de usuario existe (es decir, registrar y liberar) usuarios = (intensor) arg0.getSession (). getAttribute ("user"); if (user! = null) {string sessionId = mApper.getUserEntity (integer.valueOf (user)). getSessionId (); if (sessionId.equals (arg0.getSession (). getId ())) {return real;} else {arg1.setStatus (arg1.sc_gateway_timeout); arg1.setContentType ("text/html; charset = utf-8"); printwriter out = arg1.getwriter (); out.println ("<html>"); out.println ("<script>); out. out. out (" alerta ("" <html> "); te ves obligado a desconectar ') "); out.println (" window.open (' " + arg0.getContextPath () +" /new/login' ,'_top');");;/pprintln("</script>":); arg0.getRequestDispatcher ("Login.jsp"). Forward (arg0, arg1); return false;}} arg0.getRequestDispatcher ("Login.jsp"). ADELAR (Arg0, Arg1); return False;}}El código anterior puede realizar la función del primer usuario iniciado que se está exprimiendo de la línea cuando el mismo usuario inicia sesión varias veces. Puede darse cuenta de la función de pedir a la cuenta que inicie sesión de forma remota y luego saltar a la página de inicio de sesión. Aquí debemos explicar los puntos clave de esta simple función de solicitud de alerta. Si esta alerta debe aparecer, debe poder finalizar la solicitud. Luego, la función de impresión de respuesta genera la instrucción ALERT, por lo que la declaración de salto comentado no puede existir. Si lo existe, no se emitirá la declaración de solicitud de alerta, porque su operación no termina correctamente, sino que se reenvía o se redirige a otras operaciones. Ya sea correcto o no, se emitirá de otras acciones a la página, por lo que no aparecerá su declaración de impresión de respuesta. Entonces, la forma correcta es: la solicitud de interceptación no se libera (returnfalse), y la solicitud sigue siendo la solicitud original y no saltará. Se puede mostrar la información de impresión de la respuesta a la página. En cuanto a saltar a la página de inicio de sesión, puede usar: out.println ("window.open ('"+arg0.getContextPath ()+"/new/login', '_ top');"); Para implementar que la respuesta se ejecuta una solicitud de acción en una sección de salida de JS, apuntando a la página de inicio de sesión.
El código anterior se ha considerado básicamente como una función de inicio de sesión de un solo usuario, pero encontrará que la operación de la solicitud AJAX no apunta a la página de inicio de sesión al iniciar sesión en una ubicación remota, y no hay información de inmediato. Permítanme explicar primero el motivo, porque su AJAX está haciendo una solicitud asíncrona, y la URL solicitada también coincide con el mapeador del procesador, por lo que se considerará ya que la solicitud es exitosa (el código de estado de retorno es 200). La declaración JS impresa en la respuesta anterior se convertirá en la solicitud exitosa de éxito y el valor de retorno. Puede intentar comentar la oración anterior: arg1.setStatus (arg1.sc_gateway_timeout); En este momento, se deben realizar algunas otras operaciones. La primera es la declaración arg1.setStatus (arg1.sc_gateway_timeout); Su función es establecer el código de estado devuelto por respuesta. La configuración anterior indica que el código de estado 504 se devolverá para representar un error de solicitud. En este momento, la solicitud AJAX ya no responderá en el método de éxito, sino que responderá al método de error AJAX. Por lo tanto, solo necesita ejecutar el método correspondiente en el error AJAX, por ejemplo:
$ .AJAX ({url: 'new/msd2', éxito: function (a) {alert (a);}, error: function (rs) {if (rs.status == 504) {document.write (rs.ResponseText);}}});Cuando la solicitud AJAX se intercepta debido a un inicio de sesión remoto, establezca arg1.setStatus (arg1.sc_gateway_timeout); El estado de retorno de la solicitud se puede cambiar a 504. Luego responde el método de error. Cuando se determina que el estado es el código de estado que establece, document.write (Rs.ResponsExtext); ResponseText es la declaración JS impresa en la recepción en el interceptor. Para que estas declaraciones se ejecuten, el documento.write (); El método debe escribir el código al DOM para que entren en vigencia. En este punto, todas las solicitudes y el inicio de sesión único para las solicitudes asíncronas de AJAX se han implementado básicamente.
Deje este artículo solo para registrar el código clave, las ideas y los principios de las operaciones
Resumir
Lo anterior se trata de la implementación de un solo inicio de sesión en SpringMVC Interceptor, espero que sea útil para todos. Si hay alguna deficiencia, deje un mensaje para señalarlo. Gracias amigos por su apoyo para este sitio.