Recientemente, he desarrollado un sistema y tengo el requisito de recuperarlo a través de mi correo electrónico después de olvidar mi contraseña. Hoy en día, el sistema obligará al correo electrónico a ingresar la dirección de correo electrónico al registrarse. Uno de los propósitos es recuperarlo a través de la vinculación del correo electrónico y puede recuperar la contraseña. No hablaré sobre la función de enviar correos electrónicos a través de Java, pero concentrarme en recuperar contraseñas.
Consulte las ideas de otras personas: Envíe correos electrónicos → Solicitar URL en correos electrónicos → Verifique las URL → {Verifique modificar con éxito las contraseñas, pero salte a la página fallida sin éxito}
El punto es cómo generar esta URL y cómo analizar esta URL.
Cabe señalar que una URL solo puede modificar la contraseña una vez. Cuando la misma cuenta envía múltiples correos electrónicos, solo la URL del último correo electrónico es
El cifrado puede prevenir ataques de falsificación. La URL solo se puede verificar una vez y vincula al usuario. Genere URL: puede usar UUID para generar una clave aleatoria.
Digital Signature = MD5 (nombre de usuario +'$' +tiempo de vencimiento +'$' +clave clave)
Campo de base de datos (nombre de usuario (clave primaria), clave clave, tiempo de vencimiento)
Parámetros de URL (nombre de usuario, firma digital), generación de claves: generar una clave clave para cada usuario al recuperar la contraseña,
Ejemplo de URL: http: // localhost: 8080/user/reset_password? Sid = D622D6A23FBF86FFE696B593D55351A54AEA77 & USERNAME = TEST4
Genere tiempo de vencimiento, genere firma digital, genere URL y envíe un correo electrónico. saveRuPDate (nombre de usuario, clave clave, tiempo de vencimiento)
El siguiente es el código SpringMVC
@RequestMapping (value = "/user/i_forget_password") @ResponseBody Map público ForgetPass (httpservletRequest request, String UserName) {userssers = Userservice.FinduserByName (UserName); Map map = new HashMap <String, String> (); Cadena msg = ""; if (users == null) {// El nombre de usuario no existe msg = "El nombre de usuario no existe, no olvidará el nombre de usuario, ¿verdad?"; map.put ("msg", msg); mapa de retorno; } try {String SecretKey = Uuid.randomuuid (). ToString (); // Key TimeStamp Outkate = New TimeStamp (System.CurrentTimemillis ()+30*60*1000); // caducidad después de 30 minutos de larga fecha = Outkate.gettime ()/1000*1000; // ignorar los usuarios de milisegundos.setValidatAcode (SecretKey); ussers.setRegisterDate (Overdate); UserService.Update (usuarios); // Guardar en la clave de la base de datos clave = users.getUsername ()+"$"+fecha+"$"+SecretKey; String DigitalSignature = MD5.MD5Encode (clave); // cadena de firma digital Correo electrónicotitle = "YouFang Cloud Password Recupertal"; String ruta = request.getContextPath (); String basepath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerPort ()+ruta+"/"; String ResetPasshref = BasePath+"User/Reset_Password? Sid ="+DigitalSignature+"& UserName ="+Users.getUsername (); String CORREA ELECTCONTENT = "No responda a este correo electrónico. Haga clic en el enlace a continuación para restablecer su contraseña <br/> <a href ="+RESETPASSHREF+"Target = '_ Blank'> Haga clic en mí para restablecer su contraseña </a>"+"<br/> Consejos: si este correo electrónico excede 30 minutos, el enlace se expira. Debe reiniciar su contraseña </a>"+"<br/> Tips: si este correo electrónico excede 30 minutos, el enlace se expira. Debe reiniciar su contraseña para la contraseña para la contraseña de la contraseña de recuperación"+"+"/T "/T"; System.out.print (ResetPasshref); Sendmail.getInStatnce (). SendHtmlmail (CageTtitle, CORRAGETCONTENT, USers.GetEmail ()); msg = "La operación fue exitosa y el enlace de recuperación de contraseña se ha enviado a su dirección de correo electrónico. Restablezca su contraseña dentro de los 30 minutos"; Loginfo (solicitud, nombre de usuario, "Aplicación para recuperar su contraseña"); } catch (Exception e) {E.PrintStackTrace (); msg = "El correo electrónico no existe? Error desconocido, comuníquese con el administrador"; } map.put ("msg", msg); mapa de retorno; }El enlace se ha enviado a la dirección de correo electrónico. Ingrese la dirección de correo electrónico y haga clic en el enlace
El siguiente es el código de verificación del enlace. Verifique eso saltando a la interfaz de modificación de la contraseña, de lo contrario saltar a la interfaz fallida
@RequestMapping (value = "/user/reset_password", método = requestmethod.get) public modelandView checkResetLink (string sid, string username) {modelandView model = new ModelAndView ("Error"); Cadena msg = ""; if (sid.equals ("") || username.equals ("")) {msg = "El enlace está incompleto, por favor regenerado"; Model.AdDObject ("msg", msg); Loginfo (nombre de usuario, "recuperar el enlace de contraseña inválido"); modelo de retorno; } Usuarios usuarios = Userservice.FinduserByName (nombre de usuario); if (users == null) {msg = "El enlace es incorrecto, no se puede encontrar el usuario coincidente, vuelva a aplicar para recuperar la contraseña."; Model.AdDObject ("msg", msg); Loginfo (nombre de usuario, "El enlace de recuperación de contraseña no es válido"); modelo de retorno; } Timestamp Outdate = Users.getRegisterDate (); if (waskate.gettime () <= System.CurrentTimemillis ()) {// significa que ha caducado msg = "El enlace ha expirado, vuelva a aplicar para recuperar la contraseña"; Model.AdDObject ("msg", msg); Loginfo (nombre de usuario, "recuperar el enlace de contraseña inválido"); modelo de retorno; } String key = users.getUsername ()+"$"+Outdate.gettime ()/1000*1000+"$"+users.getValidAcode (); // cadena de firma digital DigitalSignature = md5.md5enCode (clave); System.out.println (clave+"/t"+digitalSignature); if (! digitalSignature.equals (sid)) {msg = "El enlace es incorrecto, ¿ha caducado? Reply"; Model.AdDObject ("msg", msg); Loginfo (nombre de usuario, "El enlace de recuperación de contraseña no es válido"); modelo de retorno; } model.setViewName ("user/reset_password"); // Regrese a la interfaz para modificar la contraseña modelo.AdDObject ("Nombre de usuario", nombre de usuario); modelo de retorno; }Suplemento 1: La precisión del milisegundo de los objetos de tipo de marca de tiempo se perderá cuando se guarden en datos. Por ejemplo: 2013-10-08 10: 29: 10.234 Cuando se almacena en la base de datos MySQL, se convierte en 2013-10-08 10: 29: 10.0. Los tiempos se vuelven diferentes, y los partidos de SID no serán iguales. Así que hice una operación que ignoró la precisión.
Suplemento 2: Resuelva el código confuso chino en títulos debajo de Linux
Sun.Misc.Base64Encoder ENC = new Sun.Misc.Base64Encoder ();
MailMessage.SetSubject (mimeUtility.EncodeText (mailInfo.getSubject (), "UTF-8", "b")); // Resolver el título de correo de Linux.
Suplemento 3: ¿Por qué no inserta directamente a SID en la tabla de usuario? Estaría bien comparar directamente a Sid al verificar.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.