Implementación de la función de recuperación de contraseña a través del correo electrónico
1. 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.
2. Consulte las ideas de otras personas: envíe un correo electrónico → URL de solicitud en el correo electrónico → Verifique URL → {Verifique modificar con éxito la contraseña, pero salte a la página fallida si falla}
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 existe la dirección de correo electrónico de URL del último correo electrónico.
3. 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 +'' +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,
Genere tiempo de vencimiento, genere firma digital, genere URL y envíe un correo electrónico. ADDU (nombre de usuario, clave, tiempo de vencimiento)
La base de datos utilizada es la siguiente:
La contraseña para recuperar la dirección de correo electrónico es la siguiente:
paquete com.soq.card.web.action; import java.sql.timestamp; import java.util.list; import java.util.uuid; importar org.hibernate.criteria; importar org.hibernate.session; import org.springframework.orm.Hibernate3.HibernateTemplate; import com.soq.card.biz.userhander; import com.soq.card.entity.users; import com.soq.card.tools.dbhepler; import com.soq.card.tools.mail; import com.soq.card com.soq.card.web.base.baseaction;/** * @author javen * @email [email protected] * */public class PassEmailaction extiende Baseaction {usuarios privados; Asistente de usuarios de usuarios privados; correo electrónico de cadena privada; cadena privada Sid; nombre de usuario de cadena privada; public String sendmail () {try {hibernateTeMplate ht = this.getuserhander (). getUsersdao (). gethibernateTemplate (); SessionFactory fábrica = ht.getSessionFactory (); Sesión sesión = factory.opensession (); Criterios criterios = session.createCriteria (ussers.class); criteria.add (restrictions.eq ("loginname", correo electrónico)); List <sers> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); Correo correo = nuevo correo (); String SecretKey = uuid.randomuuid (). ToString (); // Key TimeStamp Outkate = New TimeStamp (System.CurrentTimEmillis () + 30 * 60 * 1000); // Expiró después de 30 minutos de larga fecha = Outkate.gettime ()/ 1000 * 1000; // Ignorar el MilliseConds mySql El tiempo de retirada es el MilliseConds Dbhepler Bheperler = nuevo dBhepler ();); Cadena sql = "actualizar usuarios set waskate =?, ValidatAcode =? Where loginName =?;"; String str [] = {Waskate+"", SecretKey, Users.getLoginName ()}; bhepler.addu (sql, str); //this.getuserhander().getusersdao().gethibernateTemplate().Update(users); // Guardar en la base de datos System.out.println ("Nombre de usuario >>>>"+users.getusername ()); Key de cadena = users.getUsername () + "$" + fecha + "$" + SecretKey; System.out.println ("clave >>>"+clave); String DigitalSignature = md5.md5 (clave); // ruta de cadena de firma digital = this.getRequest (). GetContextPath (); String BasePath = this.getRequest (). GetsCheme () + ": //" + this.getRequest (). GetServerName () + ":" + this.getRequest (). GetServerPort () + path + "/"; String ResetPasshref = BasePath + "CheckLink? Sid =" + DigitalSignature + "& UserName =" + Users.getUsername (); String emailContent = "Do not reply to this email. Click the link below to reset your password<br/><a href=" + resetPassHref + " target='_BLANK'>" + resetPassHref + "</a> Or <a href=" + resetPassHref + " target='_BLANK'>Click me to reset your password</a>" + "<br/>tips: This email will expire after more de 30 minutos. mail.setto (correo electrónico); mail.setFrom ("xx"); // Su dirección de correo electrónico Mail.SetHost ("smtp.163.com"); mail.setUsername ("[email protected]"); // user mail.setpassword ("cxxx"); // contraseña mail.setsubject ("[Código QR CARDE] Recuperar la contraseña de su cuenta"); Mail.SetContent (CageContent); if (mail.sendMail ()) {System.out.println ("sendSuccessty Enviar"); this.getRequest (). SetAttribute ("Mesg", "Restablecer la contraseña El correo electrónico ha sido enviado, ¡inicie sesión en la dirección de correo electrónico para restablecerla!"); regresar "sendmail"; }} else {this.getRequest (). setAttribute ("Mesg", "El nombre de usuario no existe, no olvidará su buzón, ¿verdad?"); regresar "Nouser"; }} Catch (Exception e) {// tODO: manejar excepción E.PrintStackTrace (); } return null; } public String checkResetLink () {System.out.println ("Sid >>>" + SID); if (sid.equals ("") || username.equals ("")) {this.getRequest (). setAttribute ("Mesg", "El enlace está incompleto, regenerado"); System.out.println (">>>>> nulo"); devolver "error"; } HibernateTemplate ht = this.getuserhander (). GetUsersdao (). GethibernateTemplate (); SessionFactory fábrica = ht.getSessionFactory (); Sesión sesión = factory.opensession (); Criterios criterios = session.createCriteria (ussers.class); criteria.add (restrictions.eq ("nombre de usuario", nombre de usuario)); List <sers> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); Timestamp Outdate = (Timestamp) Users.getOutDate (); System.out.println ("Outse >>>"+Outkate); if (waskate.gettime () <= system.currentTimemillis ()) {// significa que this.getRequest (). setAttribute ("Mesg", "El enlace ha expirado, vuelva a aplicar para recuperar la contraseña"); System.out.println ("Tiempo de tiempo de tiempo"); devolver "error"; } String key = users.getUserName ()+"$"+Outdate.gettime ()/1000*1000+"$"+users.getValidAcode (); // Digital Signature System.out.println ("Key Link》"+Key); String DigitalSignature = md5.md5 (clave); // Digital Signature System.out.println ("DigitalSignature >>>>"+DigitalSignature); if (! digitalSignature.equals (sid)) {this.getRequest (). setAttribute ("Mesg", "El enlace es incorrecto, ¿ha expirado? System.out.println ("etiqueta incorrecta"); devolver "error"; } else {// La verificación del enlace es ir a la página de modificación de contraseña this.getRequest (). setAttribute ("Usuario", usuarios); devolver "éxito"; }} else {this.getRequest (). SetAttribute ("Mesg", "El enlace es incorrecto, el usuario coincidente no se puede encontrar, vuelva a aplicar para recuperar la contraseña"); System.out.println ("El usuario no existe"); devolver "error"; }} Usuarios públicos getUsers () {return users; } public void setUsers (usuarios de usuarios) {this.users = users; } Public UserHander getUserHander () {return UserHander; } public void setUserHander (UserHander UserHander) {this.UserHander = UserHander; } public String getEmail () {return email; } public void setEmail (correo electrónico de cadena) {this.email = correo electrónico; } public String getSID () {return sid; } public void setSid (String sid) {this.sid = sid; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; }}
Suplemento 1: La precisión del milisegundo se perderá al guardar los datos. Por ejemplo: 2014-05-20 10: 30: 10.234 Cuando se almacena en la base de datos MySQL, se convierte en 2013-05-20 10: 30: 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 usuarios? Estaría bien comparar directamente a Sid al verificar.
Dirección de descarga del código fuente: http://pan.baidu.com/s/1cl8hkq
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.