電子メールによるパスワード回復機能の実装
1.最近、私はシステムを開発しましたが、パスワードを忘れた後、電子メールを介してそれを取得する必要があります。最近では、システムは登録時に電子メールを電子メールアドレスを入力するように強制します。目的の1つは、電子メールのバインディングを介してそれを取得することであり、パスワードを取得できます。 Javaを介して電子メールを送信する機能については話しませんが、パスワードの取得に焦点を当てます。
2。他の人のアイデアを参照してください:電子メールを送信→電子メールでURLを要求→URLを検証→{パスワードを正常に変更するが、失敗した場合は失敗したページにジャンプします}
ポイントは、このURLを生成する方法と、このURLを解析する方法です。
URLはパスワードを1回しか変更できないことに注意してください。同じアカウントで複数のメールが送信されると、最後のメールのURLメールアドレスのみがあります。
3.暗号化は偽造攻撃を防ぐことができます。 URLは1回しか検証できず、ユーザーにバインドできます。 URLの生成:UUIDを使用してランダムキーを生成できます。
デジタル署名= MD5(ユーザー名 +'' +有効期間 +'' +有効期間 +'' +キーキー)
データベースフィールド(ユーザー名(プライマリキー)、キーキー、有効期限)
URLパラメーター(ユーザー名、デジタル署名)、キー生成:パスワードを取得するときに各ユーザーのキーキーを生成する、
有効期限を生成し、デジタル署名を生成し、URLを生成し、電子メールを送信します。 addu(ユーザー名、キー、有効期限)
使用されるデータベースは次のとおりです。
メールアドレスを取得するためのパスワードは次のとおりです。
パッケージ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.session.Session. org.springframework.orm.hibernate3.hibernateTemplate;インポート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; com.soq.card.web.base.baseAction;/** * @author javen * @email [email protected] * */public class passemailaction extends baseAuttion {private users;プライベートユーザーハンダーユーザーハンダー。プライベート文字列メール;プライベートストリングシド;プライベート文字列ユーザー名; public string sendmail(){try {hibernatetemplate ht = this.getuserhander()。getusersdao()。gethibernateTemplate(); sessionFactory Factory = Ht.GetSessionFactory();セッションセッション= factory.opensession();基準基準= session.createcriteria(users.class); Criteria.Add(Restions.eq( "loginname"、email));リスト<ユーザー> list = criteria.list(); if(list.size()> 0){users = list.get(0);メールメール= new Mail(); string secretkey = uuid.randomuuid()。toString(); //キータイムスタンプアウトトア=新しいタイムスタンプ(System.CurrentTimemillis() + 30 * 60 * 1000); //長い日付の後に期限切れ= autdate.getTime()/ 1000 * 1000; //ミリ秒mysqlを無視すると、離脱時間はMilliseconds dbhepler bhepler = new dbhepler()を無視しています。 string sql = "Update users set Outdate =?、validatacode =?where loginname =?;"; string str [] = {outdate+""、secretkey、users.getloginname()}; Bhepler.Addu(SQL、STR); //this.getuserhander().getusersdao( ).gethibernateTemplate().Update(users); //データベースSystem.out.println( "username >>>>"+users.getUsername())に保存します。 string key = users.getUsername() + "$" + date + "$" + secretkey; System.out.println( "key >>>"+key); string digitalSignature = md5.md5(key); // signature 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 = "この電子メールに返信しないでください。以下のリンクをクリックしてパスワードをリセット<br/> <a href =" + resetpasshref + "target = '_ blank'>" + resetpasshref + "</a> 30分以上終了すると、「検索パスワード」を再申請する必要があります。 mail.setto(email); mail.setfrom( "xx"); //メールアドレスmail.sethost( "smtp.163.com"); mail.setUsername( "[email protected]"); // user mail.setpassword( "cxxx"); // password mail.setsubject( "[qr code busness card]アカウントパスワードを取得"); mail.setContent(EmailContent); if(mail.sendmail()){system.out.println( "sendsuccessully send"); this.getRequest()。setAttribute( "mesg"、 "パスワードのリセットメールが送信されました。メールアドレスにログインしてリセットしてください!"); 「sendmail」を返します。 }} else {this.getRequest()。setAttribute( "mesg"、 "ユーザー名は存在しません、メールボックスを忘れないでしょうか?"); 「nouser」を返します。 }} catch(例外e){// todo:例外e.printstacktrace()を処理します; } nullを返します。 } public string checkResetlink(){System.out.println( "Sid >>>" + sid); if(sid.equals( "")|| username.equals( "")){this.getRequest()。setAttribute( "mesg"、 "リンクは不完全です、再生してください"); System.out.println( ">>>>> null"); 「エラー」を返します。 } hibernateTemplate ht = this.getuserhander()。getusersdao()。gethibernateTemplate(); sessionFactory Factory = Ht.GetSessionFactory();セッションセッション= factory.opensession();基準基準= session.createcriteria(users.class); Criteria.Add(Restions.eq( "username"、username));リスト<ユーザー> list = criteria.list(); if(list.size()> 0){users = list.get(0); Timestamp Outdate =(Timestamp)users.getoutDate(); System.out.println( "outthate >>>"+outusttate); if(outdate.getTime()<= system.currenttimemillis()){// this.getRequest()。setAttribute( "mesg"、 "リンクの有効期限が切れていることを意味します。パスワードを取得するために再申請してください。"); System.out.println( "Time Timeout"); 「エラー」を返します。 } string key = users.getUsername()+"$"+outdate.getTime()/1000*1000+"$"+users.getValidatacode(); // Digital Signature System.out.println( "key link》"+key); string digitalSignature = md5.md5(key); // Digital Signature System.out.println( "DigitalSignature >>>>"+digitalSignature); if(!digitalSignature.equals(sid)){this.getRequest()。setAttribute( "mesg"、 "リンクは間違っています。 system.out.println( "Incorrect label"); 「エラー」を返します。 } else {//リンク検証は、パスワード変更ページthis.getRequest()。setAttribute( "user"、users)に移動することです。 「成功」を返します。 }} else {this.getRequest()。setAttribute( "mesg"、 "リンクが正しくありません。一致するユーザーが見つかりません。パスワードを取得するために再申請してください。"); System.out.println( "ユーザーは存在しません"); 「エラー」を返します。 }} public users getusers(){return users; } public void setusers(ユーザーユーザー){this.users = users; } public userhander getuserhander(){return userhander; } public void setuserhander(userhander userhander){this.userhander = userhander; } public string getemail(){return email; } public void setemail(string email){this.email = email; } 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; }}
サプリメント1:データを保存すると、ミリ秒の精度が失われます。例:2014-05-20 10:30:30:10.234 MySQLデータベースに保存すると、2013-05-20 10:30:10.0になります。時間が異なり、SIDの試合は等しくありません。それで、私は正確さを無視した操作をしました。
サプリメント2:Linuxの下のタイトルで中国の文字化けコードを解く
sun.misc.base64encoder enc = new sun.misc.base64encoder(); mailmessage.setsubject(mimeutility.encodetext(mailinfo.getsubject()、 "utf-8"、 "b")); // Linuxメールのタイトルを除くGarledを解決します
サプリメント3:SIDをユーザーテーブルに直接挿入してみませんか?検証するときにSIDを直接比較しても構いません。
ソースコードのダウンロードアドレス:http://pan.baidu.com/s/1cl8hkq
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。