He estado inactivo recientemente y no tengo proyectos que hacer, así que resolví algunos problemas comunes que encontré en mi trabajo diario. En primer lugar, pensé en el problema de las restricciones de inicio de sesión de múltiples usuarios. Déjame hacer algunas ideas sobre este tema.
Lecturas relacionadas:
Java Web Development Solución perfecta para evitar que múltiples usuarios de inicio de sesión repetido
1. Escena de diseño
1) Un usuario no puede iniciar sesión en varios lugares al mismo tiempo
2) El usuario ha iniciado sesión en A. Ahora se le permite iniciar sesión desde B, pero exprimirá A (teniendo en cuenta que el usuario ha estado en B debido a algunas circunstancias después de iniciar sesión en A, pero aún quiere continuar el trabajo anterior, por lo que necesita iniciar sesión en el sistema)
3) Después de exprimir una de B, el sistema dará un mensaje cuando A realice otras operaciones. El usuario inicia sesión en otro lugar. Si la contraseña puede filtrarse si no es para su propia operación, cambie la contraseña.
2. Mapa de ideas
Cuando cada usuario inicia sesión, generalmente almacenamos información del usuario en la sesión para que el sistema pueda obtener fácilmente la información básica del usuario cuando el usuario realiza operaciones. Sin embargo, esta sesión es privada y solo es visible para el usuario actual (si acepta que el usuario obtendrá diferentes sesiones, que es la causa raíz de por qué múltiples usuarios pueden iniciar sesión). Luego se produce la pregunta, ¿cómo puede un usuario saber si está en línea al iniciar sesión? Creo que eres inteligente, ya has pensado que esto no es fácil. ¿No es el problema de almacenar información del usuario en línea en un lugar público? Después de verificar en línea, la solución es completamente diferente, y es aproximadamente los siguientes dos tipos.
1) Identificar usuarios en línea en la base de datos
2) Almacenar en la aplicación
Después de muchas consideraciones, encontraremos que la Solución 1 necesita resolver muchos problemas difíciles (salida anormal del usuario y estado de modificación futura, el acceso frecuente a la base de datos afecta el rendimiento, etc.), lo que obviamente es inapropiado para usted que requiere perfección. Así que adoptamos la solución 2, guardando información del usuario en línea en la aplicación, y el diseño específico es el siguiente.
1) diagrama de flujo de inicio de sesión
2) Gráfico de flujo de operación después de ser exprimido
3. Código
1) Método de inicio de sesión
@RequestMapping (valor = "/login", método = requestmethod.post) public string login (string username, string contraseña, redirectAtTributes redirectAtTributes, httpservletRequest request) {// juzga si el usuario ha sido en línea y procesado (elimine está en línea) string loginLimite = limitLogin.LoginLimite (solicitud, solicitud, solicitud,//////juzga en línea) La contraseña es una cadena correcta result = Userservice.login (nombre de usuario, contraseña); if (result.equals ("stitsing")) {request.getSession (). setAttribute ("Now_user", UserService.FindByUsername (username)); // Cree token y verifique la cadena jwttoken = tokenservice.createUserauthToken (userService.findbyusername (username)); tokensystem.out.println (jwttoken); userAuthenticationToken authtoken = tokenservice.retrieveUserauthToken (jwttoken); // token parses system.out.println (authtoken.isauthenticated ()); system.println ("id =" + " +" + " +" + " +" + " +" + " +" + " UserAuthenticationToken.getCurrentToken (). GetUseruuid ()); // El usuario está desconectado y redirige al enlace guardado después de iniciar sesión. Object url = request.getSession (). GetAttribute ("redirect_link"); if (url! = null) {request.getSession (). RemoveAttribute ("redirect_link"); return "redirect:" + url.ToString ();} return "index";} redirectattributes.addflashattribute ("mensaje", resultado); return "Redirect:/otros/toologin";}2) Inicie sesión para determinar si ya está en línea
@Service @TransActionAlPublic Class Limitelogin {private static logger log = logger.getLogger (sessionListener.class); private static map <string, string> logInUsermap = new Hashmap <> (); // almacenamiento de usuarios de usuarios estatales privados <cadena, string> loginouttime = new Hashmap <> (); // almacenamiento de usuarios de usuarios en línea LoginLImite (httpservletRequest request, String UserName) {user user = userservice.findByUsername (username); string sessionId = request.getSession (). getId (); for (String Key: logInUsermap.KeySet () {// El usuario ha iniciado sesión en otro lugar if if if if if (user.getusername ()) ! loginusermap.containsValue (sessionId)) {log.info ("user:" + user.getUsername () + ", en" + dateUtil.dateformat (new date (), "yyyy-mm-dd hh: mm: ss") + "excluido!"); loginOuttime.put (user.getusername (), dateutil.datil. (date (date (date)! "); "yyyy-mm-dd hh: mm: ss")); loginusermap.remove (user.getUsername ()); break;}} loginusermap.put (user.getUsername (), sessionID); request.getSession (). getServletContext (). LoginUsermap); request.getSession (). GetServletContext (). SetAttribute ("LoginOutTime", Loginouttime); return "Success";}}3) Iniciar sesión Interceptor (sin inicio de sesión para saltar a la página de inicio de sesión)
LoginInterceptor de clase pública extiende HandlerInterStaRAdapter {@OverridePublic Boolean PreHandle (httpservletRequest request, httpServletResponse Response, Object Handler) lanza la excepción {httpsession session = request.getSession (); user User = (user) session.getAttribute ("Now_user"); if (session.getTribe (") null) {Response.sendedirect (request.getContextPath () + "/otro/tologin"); return false;} // juicio de restricción de inicio de sesión múltiple, y dar un mensaje de inmediato boolean islogin = false; if (user! = null) {map <string, string> loginusermap = (map <cadena, cadena>)) session.getServletContext (). true; rompe;}}} if (islogin) {map <string, string> loginouttime = (map <string, string>) session.getServletContext (). en otra parte! "); loginouttime.remove (user.getUsername ()); session.getServletContext (). setAttribute (" loginusermap ", loginouttime); respuesta.sendedirect (request.getContex Postthandle (HTTPServletRequest Solicitud, respuesta httpServletResponse, Handler de objetos, ModelAndView ModelAndView) lanza la excepción {super.PosThandle (solicitud, respuesta, manejador, modelandView);}@Excepción de excepción de la excepción, excepción de la excepción (Solicitud httpServletRequest, httpServletRessesSponse Exception, excepción de excepción, excepción de la excepción de la excepción de la excepción, la excepción de la excepción, la excepción de la excepción, la excepción de la excepción, la excepción de la excepción, la excepción de la excepción, la excepción de la excepción, la excepción, la excepción, la excepción, la excepción de la excepción, la excepción, la excepción,, {Super.AfterCompletion (solicitud, respuesta, controlador, ex);}}4) Cuando se destruye la sesión, borre los pares de valor clave guardados en LoginUsermap
public classSessionListener implementa httpsessionListener {private static logger log = logger.getLogger (sessionListener.class);@overridePublic void sessionCreated (httpSessionEvent event) {} @OverridePublic -sessionDestroyed (httpsessionVent) session.getId (); // Cuando se destruye la sesión, borre el par de valores de clave guardado en LoginUsermap user User = (usuario) session.getAttribute ("Now_user"); if (user! = null) {map <string, string> loginusermap = (map <string, string>) Event.getSession (). GetServletContext (). GetAttribute ("LoginUsermap"); if (LoginUsermap.get (user.getUsername ()). Equals (sessionId)) {log.info ("Limpie el usuario de la aplicación:" + + user.getUsername ()); loginusermap.remove (user.getUsername ()); event.getSession ().5) web.xml
<
6) Código de página (utilizado para borrar la información de la sesión del usuario exprimido mientras proporciona un mensaje, de lo contrario, la información de solicitud se mostrará todo el tiempo)
<script type = "text/javaScript"> $ (documento) .Ready (function () {var message = '$ {Mess}'; if (mensaje! = "") {$ .AJAX ({type: 'get', async: false, cache: false, url: '/other/clearUsersession', data de datos: '', data: {}, exitoso: function (datos) {}}); $ ('#Mess'). Html (mensaje);}}); </script>7) Borrar el código de sesión del usuario
/*** Restricciones de inicio de sesión de múltiples usuarios, Borrar información de sesión (información de inicio de sesión, información de solicitud) ** @param solicitud*@return*/ @respuestaBody @requestmapping (valor = "/clearUsersession") public string clearUsersession (httpservletRequest solicitud) {httpsession httPsession = request.getSession (); // httpsession.Invalidate (); httpsession.removeattribute ("ahora_user"); httpsession.removeattribute ("desorden"); return "éxito";}El trabajo de desarrollo se completa aquí
4. Resultados de la operación
Lo anterior es el método de implementación de las restricciones de inicio de sesión de Java MultiSer introducido por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!