Vor kurzem habe ich ein System entwickelt und habe die Anforderung, es über meine E -Mail abzurufen, nachdem ich mein Passwort vergessen habe. Heutzutage zwingt das System die E -Mail, die E -Mail -Adresse bei der Registrierung einzugeben. Einer der Zwecke besteht darin, es durch E -Mail -Bindung abzurufen und Sie können das Kennwort abrufen. Ich werde nicht über die Funktion des Sendens von E -Mails über Java sprechen, sondern mich auf das Abrufen von Passwörtern konzentrieren.
Siehe Ideen anderer Personen: Senden Sie E -Mails → URLs in E -Mails anfordern → URLs → {Überprüfen Sie erfolgreich die Passwörter.
Der Punkt ist, wie diese URL generiert und diese URL analysiert werden kann.
Es ist zu beachten, dass eine URL das Passwort nur einmal ändern kann. Wenn mehrere E -Mails über das gleiche Konto gesendet werden, ist nur die URL der letzten E -Mail
Verschlüsselung kann Fälschungsangriffe verhindern. Die URL kann nur einmal überprüft werden und bindet den Benutzer. URL generieren: Sie können UUID verwenden, um einen zufälligen Schlüssel zu generieren.
Digital Signature = MD5 (Benutzername +'$' +Ablaufzeit +'$' +Schlüsselschlüssel)
Datenbankfeld (Benutzername (Primärschlüssel), Schlüsselschlüssel, Ablaufzeit)
URL -Parameter (Benutzername, digitale Signatur), Schlüsselgenerierung: Generieren Sie einen Schlüsselschlüssel für jeden Benutzer beim Abrufen des Kennworts.
URL -Beispiel: http: // localhost: 8080/user/reset_password? SID = D622D6A23FBF86FFE696B593D55351A54AEA77 & Benutzername = Test4
Generieren Sie die Ablaufzeit, generieren Sie digitale Signatur, generieren Sie URL und senden Sie E -Mails. SaveORUpDate (Benutzername, Schlüsselschlüssel, Ablaufzeit)
Das Folgende ist SpringMVC -Code
@RequestMapping (value = "/user/i_forget_password") @ResponseBody public map Vergessenpass (httpServletRequest -Anforderung, String -Benutzername) {Benutzer userService.finduserByName (Benutzername); Map map = new Hashmap <String, String> (); String msg = ""; if (user == null) {// Der Benutzername existiert nicht msg = "Der Benutzername existiert nicht, Sie werden den Benutzernamen nicht vergessen, oder?"; map.put ("msg", msg); Rückgabekarte; } try {string secryKey = uUid.randomuuid (). toString (); // Key Timestamp Outdate = neuer Zeitstempel (System.currentTimillis ()+30*60*1000); // Ablauf nach 30 Minuten langes Datum = outdate.getTime ()/1000*1000; // Milliseconds user.setValidatacode (SecretKey) ignorieren; user.setRegisterDate (outdate); UserService.Update (Benutzer); // in der Datenbank speichern String von KEY = user.getUername ()+"$"+Datum+"$"+SecretKey; String digitalsignature = md5.md5enCode (Schlüssel); // Digital Signatur String mailTitle = "yofinang Cloud -Passwort -Abruf"; String path = request.getContextPath (); String basepath = request.getScheme ()+": //"+request.getSerVername ()+":"+request.getServerport ()+path+"/"; String resetpassehref = basepath+"user/reset_password? Sid ="+digitalsignature+"& userername ="+user.getUnername (); String-E-MailContent = "Antworten Sie nicht auf diese E-Mail. Klicken Sie auf den Link unten, um Ihr Passwort zurückzusetzen. System.out.print (ResetPasRehref); Sendmail.getInstatnce (). Sendhtmlmail (E -Mail -Title, E -MailContent, user.getemail ()); msg = "Der Vorgang war erfolgreich und der Link zur Wiederherstellungspflichtigen wurde an Ihre E -Mail -Adresse gesendet. Bitte setzen Sie Ihr Passwort innerhalb von 30 Minuten zurück." Loginfo (Anfrage, Benutzername, "Anwendung zum Abrufen Ihres Passworts"); } catch (Ausnahme e) {e.printstacktrace (); msg = "Die E -Mail existiert nicht? Unbekannter Fehler, bitte wenden Sie sich an den Administrator."; } map.put ("msg", msg); Rückgabekarte; }Der Link wurde an die E -Mail -Adresse gesendet. Geben Sie die E -Mail -Adresse ein und klicken Sie auf den Link
Das Folgende ist der Linküberprüfungscode. Stellen Sie sicher
@RequestMapping (value = "/user/reset_password", method = requestMethod.get) public modelAndView checkResetlink (String SID, String -Benutzername) {modelAndView model = new modelAndView ("Fehler"); String msg = ""; if (sid.equals ("") || userername.equals ("") {msg = "Der Link ist unvollständig, bitte regenerieren"; model.addObject ("msg", msg); Loginfo (Benutzername, "Passwortverbindungslink ungültig abrufen"); Rückkehrmodell; } User user = userService.finduserByName (Benutzername); if (user == null) {msg = "Der Link ist falsch, der übereinstimmende Benutzer kann nicht gefunden werden. Bitte setzen Sie erneut das Kennwort ab."; model.addObject ("msg", msg); loginfo (Benutzername, "Der Link zur Wiederherstellungspflicht ist ungültig"); Rückkehrmodell; } Timestamp outdate = user.getRegisterDate (); if (outdate.getTime () <= system.currentTimemillis ()) {// bedeutet, dass er abgelaufen ist. "Der Link ist abgelaufen, bitte setzen Sie erneut das Kennwort ab." model.addObject ("msg", msg); Loginfo (Benutzername, "Passwortverbindungslink ungültig abrufen"); Rückkehrmodell; } String key = user.getUnername ()+"$"+outdate.getTime ()/1000*1000+"$"+user.getValidatacode (); // Digital Signatur String Digitalsignature = Md5.md5code (Schlüssel); System.out.println (Schlüssel+"/t"+Digitalsignature); if (! Digitalsignature.equals (SID)) {msg = "Der Link ist falsch, hat er abgelaufen? Wiederanpassung"; model.addObject ("msg", msg); loginfo (Benutzername, "Der Link zur Wiederherstellungspflicht ist ungültig"); Rückkehrmodell; } model.setViewName ("user/reset_password"); // kehren Sie zur Schnittstelle zurück, um das Passwortmodell zu ändern. Rückkehrmodell; }Ergänzung 1: Die Millisekundengenauigkeit von Objekten des Zeitstempels geht verloren, wenn sie in Daten gespeichert werden. Zum Beispiel: 2013-10-08 10: 29: 10.234 Wenn in der MySQL-Datenbank gespeichert wird, wird sie 2013-10-08 10: 29: 10.0. Die Zeiten werden unterschiedlich und SID -Übereinstimmungen sind nicht gleich. Also habe ich eine Operation durchgeführt, die die Genauigkeit ignorierte.
Ergänzung 2: Lösen Sie den chinesischen verstümmelten Code in Titeln unter Linux
sun.misc.base64Enencoder ENC = new sun.misc.base64Enencoder ();
MailMessage.SetSubject (mimeutility.encodetext (MailInfo.getSubject (), "UTF-8", "B"); // Linux -Mail -Titel verstümmelt
Ergänzung 3: Warum fügen Sie SID nicht direkt in die Benutzertabelle ein? Es wäre in Ordnung, SID bei der Überprüfung direkt zu vergleichen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.