Descripción general
Hace unos días, accidentalmente pensé en este problema y sentí que era bastante práctico y era necesario resolverlo. No se siente difícil escribir un modo simple casualmente. En realidad, es bastante simple enderezar la idea.
Para darse cuenta de que los usuarios no pueden iniciar sesión al mismo tiempo, solo piense en Sina, Baidu, etc. En realidad, solo inicie sesión en un lugar y "aprieta" el otro lugar, y puede saber cuál es el resultado de la implementación. Luego inviértelo y puede formar una idea más clara. Discutamos juntos.
En primer lugar, debemos entender qué usos los usuarios utilizan el inicio de sesión para iniciar sesión, es decir, el principio de los usuarios en línea. Esto solo está almacenando el objeto del usuario en la sesión, luego llamándolo en el marco, y se pueden hacer referencia directamente a otras páginas específicas. Luego, la función de "exprimir hacia abajo" es hacer que la sesión recién generada sea efectiva y hacer que la sesión se almacene originalmente en el usuario inválido. En este punto, se ha establecido la idea general. Entonces, ¿cómo lograrlo?
Si desea saber cómo implementarlo, debe comprender el proceso de almacenar objetos de usuario en la sesión. Después de que el usuario inicia sesión, podemos obtener el usuario del objeto del usuario y el session.setAttribute(key,value); Almacenamos el ID de usuario del usuario u otro identificador único como clave y guardamos el objeto de usuario como valor. De esta manera, puede llamar al único usuario en cualquier momento y en cualquier lugar. El problema del almacenamiento del usuario se ha resuelto, ¿qué pasa con el problema de la abolición de la sesión al iniciar sesión?
Esto en realidad no es difícil. Podemos tener más características de sesión, al igual que el uso de MAP para almacenar la identidad del usuario como clave y guardar la sesión correspondiente como un valor. Luego, cuando el usuario inicia sesión repetidamente, solo necesita sacar la sesión correspondiente e invalidarla.
En este punto, la idea de implementación ha sido clara. Después de tanto tiempo, todos están impacientes por leer el código, ¿verdad? Aquí está el código:
Pre-preparación, interfaz JSP
La interfaz es simple, solo una simple interfaz de inicio de sesión
<Form Action = "<%= request.getContextPath ()%>/userwxpServlet" método = "post"> username Š <input type = "text" name = "username"/> <br/> contraseña Š <input type = "text" name = "contraseña"/> <br/> <input type = "enviar" valor = "enviar"/> </form>
Salta a la página después del éxito
Bienvenido: ${sessionScope.user.username}登陆!<br/>
No he escrito una página fallida, puedes escribirla tú mismo y no hay nada que decir sobre la página fallida.
Implementación de entidad e inicio de sesión
Javabean del usuario
nombre de usuario de cadena privada; contraseña de cadena privada; Public User () {} Public User (String User, String Password) {super (); this.Username = user; this.password = contraseña; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; }Inicie sesión en el método de implementación del servicio del usuario, por lo que no escribiré DAO e interfaz aquí, todo es simple
Public Boolean Domain (usuario de usuario) {Properties pro = new Properties (); InputStream IS = userwxpServlet.class.getClassLoader (). GetResourceasstream ("user_wxp.properties"); String Password = Null; System.out.println (is+"--------->"+Pro); if (user == null) {return false; } try {pro.load (is); contraseña = pro.getProperty (user.getUsername ()); if (user.getPassword ()! = NULL && user.getPassword (). Equals (Password)) {System.out.println ("Iniciar sesión con éxito"); devolver verdadero; }} catch (ioException e) {E.PrintStackTrace (); } finalmente {if (is! = null) {try {is.close (); } catch (ioException e) {E.PrintStackTrace (); }} return false; }Devuelva True si el inicio de sesión es exitoso y falso si falla.
Servlet y clases de herramientas lógicas correspondientes
El siguiente código es el código real para operar el usuario
He definido dos clases aquí, una clase de herramientas y una clase de procesamiento de servlet central
Se agregan algunos elementos comunes a la clase de herramientas, como el siguiente código:
/*** Cada usuario almacena una sesión. ¡Fácil de operar de todo tipo de maneras! ! ! */ public static map <string, httpsession> mapsession = new HashMap <String, httpsession> (); Código de salida del usuario (debe volar para abolir la sesión o eliminar el objeto de usuario correspondiente): [Java] Ver CopyPublic Public Static void userLogout (String UserName) {if (mapsession.get (nombre de usuario)! = NULL) {// Obtenga la sesión del usuario que necesita salir de HttpSession Session = Mapsession.get (username); // Eliminar al usuario en el mapa <nombre de usuario, sesión>. Recuerde salir del usuario, debe abolir la sesión o eliminar el usuario mapsession.remove (nombre de usuario); // Obtener la colección de atributos de la enumeración de la sesión e = session.getAttributeNames (); // Eliminar todos los atributos mientras (E.HasmoreElements ()) {String SessionName = (String) E.NextElement (); session.removeAttribute (SessionName); } // derogar la sesión Session.Invalidate (); }}El código de servlet es el siguiente:
Doget void protegido (httpservletRequest, respuesta httpservletResponse) lanza ServLetException, ioException {String username = request.getParameter ("username"); Cadena contraseña = request.getParameter ("contraseña"); Usuario user = nuevo usuario (nombre de usuario, contraseña); UserService UserService = New UserService (); Httpsession session = request.getSession (); if (Userservice.dologin (usuario)) {// Después de iniciar sesión, inserte el usuario en la sesión Session.SetAttribute ("User", User); if (cheacksession (username)) {// Si la sesión ya existe antes de esto, salga del usuario dButil.userlogout (nombre de usuario); } // almacenamiento de la nueva sesión en map <username, session> dbutil.mapsession.put (nombre de usuario, sesión); // Después de la operación exitosa, saltar, es mejor redirigir aquí para que otros sepan que el inicio de sesión ha sido exitoso. GetRequestDIsPatcher ("Iniciar sesión"). Reenviar (solicitud, respuesta); devolver ; } // omita a la página de falla aquí. Si los lectores están interesados, pueden agregarlo usted mismo}El Código de CheckSession (nombre de usuario) es el siguiente:
/** * Compruebe si esta sesión ya está contenida * @param username * @return true: ya existe, ¡debe eliminarse! falso: no presente */ private boolean checksession (string username) {httpsession session = dButil.mapsession.get (nombre de usuario); if (session! = null) {return true; } return false; }Finalmente, adjunte la configuración XML del servlet
<Servlet> <Scuidtion> Para las pruebas, los usuarios no pueden iniciar sesión repetidamente </cription> <Spant-Name> UserWxpServlet </sipplave-name> <Servlet-name> userwxpServlet </servlet-name> <ervlet-class> com.fingard.rabbit.wxp_test.servlet.userwxpservlet </servlet-class> </servlet> <servlet> <servlet-mapping> <Servlet-Name> UserWXPservlet </Servlet-Name> <URL-Pattern>/UserWXPservlet </url-Pattern> </servlet-mapping>
La anterior es la función Java que el editor le presentó para implementar la función de inicio de sesión no repetida de los usuarios. 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!