Implémentation de la fonction de récupération de mot de passe par e-mail
1. Récemment, j'ai développé un système et j'ai besoin de le récupérer via mon e-mail après avoir oublié mon mot de passe. De nos jours, le système obligera l'e-mail à saisir l'adresse e-mail lors de l'enregistrement. L'un des objectifs est de le récupérer par la liaison des e-mails et vous pouvez récupérer le mot de passe. Je ne parlerai pas de la fonction de l'envoi de courriels via Java, mais concentrerai sur la récupération de mots de passe.
2. Reportez-vous aux idées des autres: Envoyez le courrier électronique → Demande URL dans le courrier électronique → Vérifiez l'URL → {Vérifiez avec succès modifier le mot de passe, mais passez à la page Échec s'il échoue}
Le point est de savoir comment générer cette URL et comment analyser cette URL.
Il convient de noter qu'une URL ne peut modifier le mot de passe qu'une seule fois. Lorsque plusieurs e-mails sont envoyés par le même compte, il n'y a que l'adresse e-mail de l'URL du dernier e-mail.
3. Le cryptage peut empêcher les attaques de contrefaçon. L'URL ne peut être vérifiée qu'une seule fois et lie l'utilisateur. Générer URL: vous pouvez utiliser UUID pour générer une clé aléatoire.
Digital Signature = MD5 (Nom d'utilisateur + '' + Temps d'expiration + '' + Temps d'expiration + '' + clé de clé)
Champ de base de données (nom d'utilisateur (clé primaire), clé clé, temps d'expiration)
Paramètres d'URL (nom d'utilisateur, signature numérique), génération de clés: générer une clé clé pour chaque utilisateur lors de la récupération du mot de passe,
Générer un temps d'expiration, générer des signatures numériques, générer une URL et envoyer des e-mails. Addu (nom d'utilisateur, clé, temps d'expiration)
La base de données utilisée est la suivante:
Le mot de passe pour récupérer l'adresse e-mail est le suivant:
Package com.soq.card.web.action; import java.sql.timestamp; import java.util.list; import java.util.uuid; import org.hibernate.criteria; import org.hibernate.session; import org.hibernate.sesession 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.tools.md5; import com.soq.card.web.base.baseAction; / ** * @author javen * @email [email protected] * * / classe publique PasseMailAction étend Baseaction {utilisateurs des utilisateurs privés; Userhander privé Userhander; e-mail de chaîne privée; chaîne privée Sid; Nom d'utilisateur de chaîne privée; String public sendmail () {try {hibernatetemplate ht = this.getUserHander (). getUsersdao (). getHiberNateTemplate (); SessionFactory Factory = ht.getSessionFactory (); Session Session = Factory.OpenSession (); Critères critères = session.CreateCriteria (users.class); critères.add (restrictions.eq ("loginname", e-mail)); List <s users> list = critères.list (); if (list.size ()> 0) {users = list.get (0); Mail Mail = nouveau courrier (); String SecretKey = uUid.randomuuid (). ToString (); // Timestamp de clé Outdate = Nouveau horodatage (System.Currenttimemillis () + 30 * 60 * 1000); // Expiré après 30 minutes de date = Outdate.getTime () / 1000 * 1000; // Ignorez le milliseconde Mysql Le temps de retrait est d'ignorer le missionds dbhepler bhepler = new DBHepler (); String sql = "Update Users Set Outdate =?, ValidataCode =? Où LoginName =?;"; String Str [] = {Outdate + "", SecretKey, Users.GetLogInName ()}; Bhepler.addu (SQL, Str); //this.getUserhander().GetUsersdao().GETHIBERNATETTEMPLATQUAT().Update(USERS); // Enregistrer dans Database System.out.println ("nom d'utilisateur >>>>" + utilisateurs.getUsername ()); String key = users.getUserName () + "$" + date + "$" + secretKey; System.out.println ("clé >>>" + clé); String DigitalSignature = md5.md5 (key); // Signature numérique String path = 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 = "Ne répondez pas à cet e-mail. Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe <br/> <a href =" + resetpasshref + "Target = '_ Blank'>" + resetpasshref + "</a> ou <a href =" + resetpasshref + "Target = '_ Blank'> Click me pour réinitialiser votre mot de passe </a>" + expirer après plus de 30 minutes. Mail.setTo (e-mail); Mail.setFrom ("xx"); // Votre adresse e-mail Mail.Sethost ("SMTP.163.com"); Mail.SetUsername ("[email protected]"); // user mail.setpassword ("cxxx"); // mot de passe mail.setsubject ("[carte de visite du code QR] Récupérez votre compte mot de passe"); Mail.setContent (CourrielContent); if (mail.sendmail ()) {System.out.println ("SendSuccessly Send"); this.getRequest (). setAttribute ("MESG", "réinitialiser le mot de passe L'e-mail a été envoyé, veuillez vous connecter à l'adresse e-mail pour le réinitialiser!"); retourner "sendmail"; }} else {this.getRequest (). setAttribute ("mesg", "le nom d'utilisateur n'existe pas, vous n'oublierez pas votre boîte aux lettres, non?"); retourner "Nouser"; }} catch (exception e) {// todo: gère l'exception e.printStackTrace (); } return null; } public String checkReSetLink () {System.out.println ("sid >>>" + sid); if (sid.equals ("") || username.equals ("")) {this.getRequest (). setAttribute ("mesg", "le lien est incomplet, s'il vous plaît régénérer"); System.out.println (">>>>>> null"); return "erreur"; } Hibernatetemplate ht = this.getUserHander (). GetUsersdao (). GETHIBERNATETÉTÉ (); SessionFactory Factory = ht.getSessionFactory (); Session Session = Factory.OpenSession (); Critères critères = session.CreateCriteria (users.class); critères.add (restrictions.eq ("nom d'utilisateur", nom d'utilisateur)); List <s users> list = critères.list (); if (list.size ()> 0) {users = list.get (0); Timestamp Outdate = (horodat) utilisateurs.getoutDate (); System.out.println ("Outdate >>>" + Outdate); if (outdate.getTime () <= System.CurrentTimemillis ()) {// signifie que this.getRequest (). setAttribute ("mesg", "Le lien a expiré, veuillez réappliquer pour récupérer le mot de passe."); System.out.println ("Time Outhout"); return "erreur"; } String key = users.getUsername () + "$" + outdate.getTime () / 1000 * 1000 + "$" + users.getValidatacode (); // Sigine numérique System.out.println ("Key Link》" + Key); String DigitalSignature = md5.md5 (key); // Signature Digital System.out.println ("DigitalSignature >>>>" + DigitalSignature); if (! DigitalSignature.equals (sid)) {this.getRequest (). setAttribute ("mesg", "le lien est incorrect, a-t-il expiré? Re-apply."); System.out.println ("Label incorrect"); return "erreur"; } else {// La vérification du lien consiste à passer à la page de modification du mot de passe this.getRequest (). setAttribute ("utilisateur", utilisateurs); retourner le "succès"; }} else {this.getRequest (). setAttribute ("mesg", "Le lien est incorrect, l'utilisateur correspondant ne peut être trouvé, veuillez vous réappliquer pour récupérer le mot de passe."); System.out.println ("L'utilisateur n'existe pas"); return "erreur"; }} Les utilisateurs publics getUsers () {return utilisateurs; } public void SetUsers (utilisateurs des utilisateurs) {this.users = utilisateurs; } public userhander getuserhander () {return userhander; } public void SetUserHander (userhander userhander) {this.userhander = userhander; } public String getEmail () {return e-mail; } public void setEmail (chaîne e-mail) {this.email = e-mail; } 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; }}
Supplément 1: La précision d'une milliseconde sera perdue lors de l'enregistrement des données. Par exemple: 2014-05-20 10: 30: 10.234 Lorsqu'il est stocké dans la base de données MySQL, il devient 2013-05-20 10: 30: 10.0. Les temps deviennent différents et les matchs SID ne seront pas égaux. J'ai donc fait une opération qui a ignoré la précision.
Supplément 2: Résoudre le code brouillé chinois dans les titres ci-dessous Linux
Sun.Misc.Base64Encoder ENC = new Sun.Misc.Base64Encoder (); MailMessage.SetSubject (Mimeutility.EncodeText (MailInfo.getSubject (), "UTF-8", "B")); // résoudre le titre de courrier Linux brouillé
Supplément 3: Pourquoi n'insérez-vous pas SID dans le tableau des utilisateurs directement? Il serait OK de comparer directement SID lors de la vérification.
Adresse de téléchargement du code source: http://pan.baidu.com/s/1cl8hkq
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.