Implementierung der Kennwortwiederherstellungsfunktion per E -Mail
1. 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.
2. Siehe Ideen anderer Personen: E -Mail → URL in E -Mail anfordern → URL → {Überprüfen Sie erfolgreich das Passwort, aber springen Sie zur fehlgeschlagenen Seite, wenn es fehlschlägt
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, gibt es nur die URL -E -Mail -Adresse der letzten E -Mail.
3.. 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 +'' +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.
Generieren Sie die Ablaufzeit, generieren Sie digitale Signatur, generieren Sie URL und senden Sie E -Mails. Addu (Benutzername, Schlüssel, Ablaufzeit)
Die verwendete Datenbank lautet wie folgt:
Das Passwort zum Abrufen der E -Mail -Adresse lautet wie folgt:
Paket com.soq.card.web.Action; import Java.sql.timestamp; import Java.util.list; Import Java.util.UUID; org.springframework.orm.hibernate3.hibernatetemplate; import com.soq.card.biz.userhander; import com.soq.card.Entity.users; com.soq.card.web.base.baseaction;/** * @author javen * @email [email protected] * */public class passemailaction erweitert Baseaction {private Benutzer; private userHander userHander; private Zeichenfolge E -Mail; private String Sid; privater String -Benutzername; public String sendmail () {try {hibernatetemplate ht = this.getUserHander (). getUsersDao (). GethiberNatetemplate (); SessionFactory Factory = ht.getSessionFactory (); Session Session = factory.openSession (); Kriterienkriterien = Sitzung.Createcriteria (user.class); criteria.add (restriktions.eq ("loginName", E -Mail)); Liste <Unters> list = criteria.list (); if (list.size ()> 0) {user = list.get (0); Mail mail = new Mail (); String secryKey = uUid.randomuuid (). ToString (); // Key Timestamp Outdate = neuer Zeitstempel (System.CurrentTimemillis () + 30 * 60 * 1000); // Ablauf nach 30 Minuten langes Datum = Outdate.getTime ()/ 1000 * 1000; // ignorieren Sie die Millisekonds mySQL Die Abhebungszeit ignoriert die Millisekunden dBhepler Bhepler Bhepler Bhepler Bhepler bhepler = new Dbhepler (); String SQL = "Aktualisieren Benutzer SET OADERE =?, Validatacode = where loginName =?;"; String str [] = {outdate+"", secryKey, user.getLoginName ()}; Bhepler.addu (SQL, Str); //this.getuserhander().getusersdao().Gethibernatetemplate().update(uSers); // auf Database system.out.println speichern ("Benutzername >>>"+user.getusername ()); String key = user.getUnername () + "$" + Datum + "$" + SecretKey; System.out.println ("Schlüssel >>>"+Schlüssel); String digitalsignature = md5.md5 (Schlüssel); // Digital Signature String Path = this.getRequest (). GetContextPath (); String basepath = this.getRequest (). GetScheme () + ": //" + this.getRequest (). GetServerName () + ":" + this.getRequest (). GetServerport () + path + "/"; String resetpassehref = Basepath + "Checklink? 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. als 30 Minuten. Mail.setto (E -Mail); mail.setfrom ("xx"); // Ihre E -Mail -Adresse Mail.sethost ("SMTP.163.com"); mail.setusername ("[email protected]"); // user mail.setpassword ("cxxx"); // password mail.setsubject ("[QR -Code -Visitenkarte] Ihr Kontokennwort abrufen"); mail.setContent (E -MailContent); if (mail.sendmail ()) {system.out.println ("sendSuccessible sending"); this.getRequest (). setAttribute ("mesg", "Kennwort zurücksetzen Die E -Mail wurde gesendet, melden Sie sich an der E -Mail -Adresse an, um es zurückzusetzen!"); zurück "sendmail"; }} else {this.getRequest (). setAttribute ("mesg", "Der Benutzername existiert nicht, Sie werden Ihre Mailbox nicht vergessen, oder?"); zurück "Nouser"; }} catch (Ausnahme e) {// toDo: Behandeln Sie die Ausnahme E.PrintStackTrace (); } return null; } public String checkResetLink () {System.out.println ("SID >>>" + SID); if (sid.equals ("") || username.equals ("") {this.getRequest (). setAttribute ("mesg", "Der Link ist unvollständig, bitte regenerieren"); System.out.println (">>>>> null"); "Fehler" zurückgeben; } Hibernatetemplate ht = this.getUserHander (). GetUsersdao (). Gethibernatetemplate (); SessionFactory Factory = ht.getSessionFactory (); Session Session = factory.openSession (); Kriterienkriterien = Sitzung.Createcriteria (user.class); criteria.add (restriktions.eq ("Benutzername", Benutzername)); Liste <Unters> list = criteria.list (); if (list.size ()> 0) {user = list.get (0); Timestamp outdate = (timestamp) users.getOutdate (); System.out.println ("veraltet >>>"+outdate); if (outdate.getTime () <= system.currentTimemillis ()) {// bedeutet, dass this.getRequest (). setAttribute ("mesg", "der Link ist abgelaufen, bitte tragen Sie erneut auf, um das Kennwort abzurufen."); System.out.println ("Zeitüberschreitung"); "Fehler" zurückgeben; } String key = user.getUnername ()+"$"+outdate.getTime ()/1000*1000+"$"+user.getValidatacode (); // Digital Signature System.out.println ("Schlüssellink》"+Key); String digitalsignature = md5.md5 (Schlüssel); // Digital Signature System.out.println ("Digitalsignature >>>>"+Digitalsignature); if (! Digitalsignature.equals (SID)) {this.getRequest (). setAttribute ("mesg", "Der Link ist falsch, hat es abgelaufen? System.out.println ("Falsche Label"); "Fehler" zurückgeben; } else {// Die Linküberprüfung erfolgt durch die Seite Kennwortänderung. zurück "Erfolg"; }} else {this.getRequest (). setAttribute ("mesg", "Der Link ist falsch, der passende Benutzer kann nicht gefunden werden, bitte beantragen Sie das Kennwort ab, um das Kennwort abzurufen."); System.out.println ("Benutzer existiert nicht"); "Fehler" zurückgeben; }} öffentliche Benutzer getUsers () {Rückgabe -Benutzer; } public void setUsers (Benutzer Benutzer) {this.users = Benutzer; } public userHander getUserHander () {return userHander; } public void setUserHander (userHander userHander) {this.userHander = userHander; } public String getemail () {E -Mail zurückgeben; } public void setemail (String -E -Mail) {this.email = E -Mail; } public String getSID () {return Sid; } public void setsid (String sid) {this.sid = Sid; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; }}
Ergänzung 1: Die Millisekundengenauigkeit geht beim Speichern auf Daten verloren. Zum Beispiel: 2014-05-20 10: 30: 10.234 Wenn in der MySQL-Datenbank gespeichert ist, wird sie 2013-05-20 10: 30: 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.base64Encoder ENC = new sun.misc.base64Encoder (); MailMessage.Setsubject (Mimeutility.EndEtext (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.
Quellcode -Download -Adresse: http://pan.baidu.com/s/1cl8hkq
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.