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.
Reportez-vous aux idées des autres: Envoyez les e-mails → Demander des URL dans les e-mails → Vérifiez les URL → {Vérifiez avec succès les mots de passe, mais passez à la page échouée sans succès}
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, seule l'URL du dernier e-mail est
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 + '$' + clé 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,
Exemple URL: http: // localhost: 8080 / user / reset_password? Sid = d622d6a23fbf86ffe696b593d55351a54aeaa77 & username = test4
Générer un temps d'expiration, générer des signatures numériques, générer une URL et envoyer des e-mails. SaveorUpdate (nom d'utilisateur, clé clé, heure d'expiration)
Ce qui suit est le code Springmvc
@RequestMapping (value = "/ user / i_forget_password") @ResponseBody Public Map ForgetPass (requête httpservletRequest, String username) {Usersthers = userService.FinSerByName (nom d'utilisateur); Map map = new hashmap <string, string> (); String msg = ""; if (users == null) {// Le nom d'utilisateur n'existe pas msg = "Le nom d'utilisateur n'existe pas, vous n'oublierez pas le nom d'utilisateur, non?"; map.put ("msg", msg); carte de retour; } try {String SecretKey = uUid.randomuuid (). toString (); // Timestamp de clé Outdate = Nouveau horodatage (System.CurrenttimeMillis () + 30 * 60 * 1000); // Expiration après 30 minutes de date = Outdate.getTime () / 1000 * 1000; // ignorez les millisecondes users.setvalidatacode (SecretKey); users.setRegisterDate (Outdate); userService.update (utilisateurs); // Enregistrer sur la chaîne de base de données KEY = USERS.GetUserName () + "$" + date + "$" + secrétyke; String DigitalSignature = md5.md5encode (key); // chaîne de signature numérique emailTitle = "YouFang Cloud Password Retrieval"; String path = request.getContextPath (); String basepath = request.getscheme () + ": //" + request.getServerName () + ":" + request.getServerport () + path + "/"; String resetpasshref = basepath + "user / reset_password? 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'> Cliquez sur moi pour réinitialiser votre mot de passe </a>" + "<br/> Conseils: si cet e-mail dépasse les 30 minutes, le lien expirera. System.out.print (ResetPassHref); Sendmail.getInStatnce (). Sendhtmlmail (emailTitle, emailContent, users.getEmail ()); msg = "L'opération a réussi et le lien de récupération de mot de passe a été envoyé à votre adresse e-mail. Veuillez réinitialiser votre mot de passe dans les 30 minutes"; Loginfo (demande, nom d'utilisateur, "Application pour récupérer votre mot de passe"); } catch (exception e) {e.printStackTrace (); msg = "l'e-mail n'existe pas? Erreur inconnue, veuillez contacter l'administrateur."; } map.put ("msg", msg); carte de retour; }Le lien a été envoyé à l'adresse e-mail. Entrez l'adresse e-mail et cliquez sur le lien
Ce qui suit est le code de vérification des liens. Vérifiez qu'en sautant vers l'interface de modification du mot de passe, sinon passant à l'interface échouée
@RequestMapping (value = "/ user / reset_password", méthode = requestMethod.get) public ModelAndView CheckReSetLink (String Sid, String Username) {ModelandView Model = new ModelAndView ("Error"); String msg = ""; if (sid.equals ("") || username.equals ("")) {msg = "Le lien est incomplet, veuillez régénérer"; Model.AddObject ("MSG", MSG); Loginfo (nom d'utilisateur, "récupérer le lien de mot de passe invalide"); modèle de retour; } Utilisateurs utilisateurs = userService.FindUserByName (nom d'utilisateur); if (users == null) {msg = "Le lien est faux, l'utilisateur correspondant ne peut pas être trouvé, veuillez réappliquer pour récupérer le mot de passe."; Model.AddObject ("MSG", MSG); Loginfo (nom d'utilisateur, "Le lien de récupération de mot de passe est invalide"); modèle de retour; } TimeStamp Outdate = Users.getRegisterDate (); if (outdate.getTime () <= System.currentTimeMillis ()) {// signifie qu'il a expiré msg = "le lien a expiré, veuillez réappliquer pour récupérer le mot de passe."; Model.AddObject ("MSG", MSG); Loginfo (nom d'utilisateur, "récupérer le lien de mot de passe invalide"); modèle de retour; } String key = users.getUsername () + "$" + outdate.getTime () / 1000 * 1000 + "$" + users.getValidatacode (); // chaîne de signature numérique DigitalSignature = md5.md5encode (key); System.out.println (Key + "/ T" + DigitalSignature); if (! DigitalSignature.equals (sid)) {msg = "Le lien est incorrect, a-t-il expiré? Réapproche"; Model.AddObject ("MSG", MSG); Loginfo (nom d'utilisateur, "Le lien de récupération de mot de passe est invalide"); modèle de retour; } modèle.setViewName ("user / reset_password"); // retourne à l'interface pour modifier le mot de passe modèle.addObject ("nom d'utilisateur", nom d'utilisateur); modèle de retour; }Supplément 1: La précision de la milliseconde des objets de type horodatage sera perdue lorsqu'elles seront enregistrées sur les données. Par exemple: 2013-10-08 10: 29: 10.234 Lorsqu'il est stocké dans la base de données MySQL, il devient 2013-10-08 10: 29: 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 ();
MAINMESSAGE.SETSUSBject (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 la table d'utilisateurs directement? Il serait OK de comparer directement SID lors de la vérification.
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.