最近、私はシステムを開発しましたが、パスワードを忘れた後、電子メールでそれを取得する必要があります。最近では、システムは登録時に電子メールを電子メールアドレスを入力するように強制します。目的の1つは、電子メールのバインディングを介してそれを取得することであり、パスワードを取得できます。 Javaを介して電子メールを送信する機能については話しませんが、パスワードの取得に焦点を当てます。
他の人のアイデアを参照してください:メールを送信します→メールでURLを要求します→URLを検証→{パスワードを正常に変更するが、成功せずに失敗したページにジャンプする}
ポイントは、このURLを生成する方法と、このURLを解析する方法です。
URLはパスワードを1回しか変更できないことに注意してください。同じアカウントで複数のメールが送信されると、最後のメールのURLのみが
暗号化は偽造攻撃を防ぐことができます。 URLは1回しか検証できず、ユーザーにバインドできます。 URLの生成:UUIDを使用してランダムキーを生成できます。
Digital Signature = MD5(ユーザー名 +'$' +有効期間 +'$' +キーキー)
データベースフィールド(ユーザー名(プライマリキー)、キーキー、有効期限)
URLパラメーター(ユーザー名、デジタル署名)、キー生成:パスワードを取得するときに各ユーザーのキーキーを生成する、
URL例:http:// localhost:8080/user/reset_password?sid = d622d6a23fbf86ffe696b593d55351a54aeaeaea77&username = test4
有効期限を生成し、デジタル署名を生成し、URLを生成し、電子メールを送信します。 Saveorupdate(ユーザー名、キーキー、有効期限)
以下はSpringMVCコードです
@RequestMapping(value = "/user/i_forget_password")@responsebody public map forgatepass(httpservletrequest request、string username){users users = userservice.finduserbyname(username);マップマップ= new hashmap <string、string>();文字列msg = ""; if(users == null){//ユーザー名は存在しませんmsg = "ユーザー名は存在しません、ユーザー名を忘れませんよね?」; map.put( "msg"、msg);マップを返します。 } try {string secretkey = uuid.randomuuid()。toString(); //キータイムスタンプアウトトア=新しいタイムスタンプ(System.CurrentTimemillis()+30*60*1000); //長い30分後の有効期限= outthate.getTime()/1000*1000; // milliseconds users.setvalidatacode(secretkey)を無視します。 users.setregisterdate(outustte); userservice.update(users); //データベースに保存されていますkey = users.getUsername()+"$"+date+"$"+secretkey; string digitalSignature = md5.md5encode(key); //デジタル署名文字列emailTitle = "youfangクラウドパスワード取得"; 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 = "この電子メールに返信しないでください。下のリンクをクリックしてパスワードをリセットします<br/> <a href ="+resetpasshref+"target = '_ blank'>パスワードをクリックして[+" <br/>ヒント:このメールが30分を超えた場合、リンクは失効します。 system.out.print(resetpasshref); sendmail.getinstatnce()。sendhtmlmail(emailtitle、emailcontent、users.getemail()); MSG = "操作は成功し、パスワードリカバリリンクがメールアドレスに送信されました。30分以内にパスワードをリセットしてください」。 loginfo(request、username、 "パスワードを取得するためのアプリケーション"); } catch(Exception e){e.printstacktrace(); msg = "電子メールは存在しませんか?不明なエラー、管理者に連絡してください。"; } map.put( "msg"、msg);マップを返します。 }リンクはメールアドレスに送信されました。メールアドレスを入力して、リンクをクリックします
以下はリンク検証コードです。パスワード変更インターフェイスにジャンプすることにより、失敗したインターフェイスにジャンプすることにより、それを確認します
@RequestMapping(value = "/user/reset_password"、method = requestmethod.get)public modelandview checkResetlink(string sid、string username){modelandview model = new modelandview( "error");文字列msg = ""; if(sid.equals( "")|| username.equals( "")){msg = "リンクが不完全です、再生してください"; model.addobject( "msg"、msg); loginfo(username、 "パスワードリンクの取得無効");戻りモデル。 } users = userservice.finduserbyname(username); if(users == null){msg = "リンクが間違っている場合、一致するユーザーが見つかりません。パスワードを取得するために再申請してください。"; model.addobject( "msg"、msg); loginfo(username、 "パスワードリカバリリンクは無効です");戻りモデル。 } Timestamp Outdate = users.getRegisterDate(); if(outdate.getTime()<= system.currenttimemillis()){// MSG = "の有効期限が切れたことを意味します。 model.addobject( "msg"、msg); loginfo(username、 "パスワードリンクの取得無効");戻りモデル。 } string key = users.getUsername()+"$"+outdate.getTime()/1000*1000+"$"+users.getValidatacode(); //デジタル署名文字列digitalSignature = md5.md5encode(key); System.out.println(key+"/t"+digitalSignature); if(!digitalSignature.equals(sid)){msg = "リンクが間違っている場合、有効期限が切れていますか?再適用"; model.addobject( "msg"、msg); loginfo(username、 "パスワードリカバリリンクは無効です");戻りモデル。 } model.setViewName( "user/reset_password"); //パスワードmodel.addobject( "username"、username)を変更するためにインターフェイスに戻ります。戻りモデル。 }サプリメント1:タイムスタンプタイプのオブジェクトのミリ秒の精度は、データに保存されると失われます。例:2013-10-08 10:29:10.234 MySQLデータベースに保存すると、2013-10-08 10:29: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を直接比較しても構いません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。