本文將介紹忘記密碼時經過發送重置密碼郵件找回密碼的實現思路。整個實現過程當中最重要的就是如下三點:html
先來個實現的效果展現吧,而後再仔細分析如何去實現各個部分:前端
(這裏盜用下咱們小組做品成果的前端)
java
用戶輸入註冊時的郵箱帳戶獲取重置密碼的連接git
用戶登陸本身的郵箱查看郵件github
用戶點擊重置密碼連接,若是在重置連接有效期內咱們跳轉到重置密碼界面,不然提醒用戶該連接已過時web
在總體看了效果以後,咱們就來逐步分析功能實現。首先是發郵件,這個功能我借用了一位博主寫好的代碼,這雖然是他09年寫的,可是實現效果依舊很好。代碼中的註釋也很詳細,我也不用再多作解釋(實際狀況是,我也沒有太認真去讀該代碼,只是當了一個搬運工,哈哈~)。文末附上了該博主的博客連接。我發送郵件的demo可見github:算法
而後介紹下在使用過程碰見的坑,不出意外十有八九你們都會碰見。主要有兩個:數組
也就是報錯以下:安全
這也是由於,在填寫發送郵件的密碼時,應該使用受權碼,而不是密碼!!!oracle
這個是由於你的郵件被網易郵箱(我用的是網易郵箱發郵件)識別成垃圾郵件,而後就不會給你發。個人解決辦法是,修改郵件的內容,僅包含少許的提示信息和重置密碼連接。這樣就成功地發送了。
如何發送郵件這個問題解決,那麼下一步就是,郵件中的重置密碼連接應該是怎樣?
Constructor PasswordAuthentication can not be applied to given types. required java.lang.String,java.lang.char[]
出現這個問題的緣由是咱們導錯了包
不該該爲
import java.net.Authenticator; import java.net.PasswordAuthentication;
而要導入
import javax.mail.Authenticator; import javax.mail.PasswordAuthentication;
重置密碼連接中應該最少包含兩個信息:用戶的標識
和連接的有效時間
。用戶標識是爲了指定爲哪一個重置密碼,而有效時間是從安全性角度來看是爲了重放攻擊。我此次就實現就在連接中僅包含了這兩個信息,若是有需求能夠加入更多標識信息。
而後最重要的一點就是,要對信息加密!!若是不加密的話就很容易遭受篡改攻擊!還須要注意,咱們不能使用hash算法加密,如md5。從本質上講md5不算是加密算法,是一種單向的產生散列值的算法,用於檢驗信息的完整性。加密算法要求能夠解密,是可逆的。
在本次demo中,我使用了DES算法對用戶標識(用戶輸入的郵箱)和產生連接的時間(也就是系統當前的時間)進行加密。
// 獲取系統當前時間 Date now = new Date(); String currentTime = "" + now.getTime(); // 重置密碼連接 String urlStr = "http://localhost:8080/LoveMovie/forgetPassword/resetPassword?key="; String plainText = currentTime + "@" + userEmail; // 當前時間加上用戶郵箱 使用@進行鏈接兩者,在大多數狀況下不會產生歧義 String desKey = "LOVEMOIVE"; // des算法中的密鑰 String link = urlStr + DESUtil.encrypt(desKey, plainText); //加密後的連接
原本打算使用前幾篇本身實現的DES算法進行加密可不知道爲何老是報錯數組越界,找了好久沒有找到問題所在,因而就又使用了別人寫好的DES(又作了一次搬運工~ (@^_^@)~)。若是想要對更加深刻理解DES加密算法的話,能夠看看個人寫的博客對稱密碼——DES加密算法(羞恥地推薦一波~)
關於生成重置密碼連接的完整代碼我準備放在和驗證重置連接的代碼一塊兒給出,由於生成連接是加密而驗證連接是解密,加解密一塊兒看思路會更清晰一點。
這個的實現思路就很簡單了,提取連接中的參數key的值,而後使用des解密出明文。分割明文字符串爲發送郵件的時間和用戶郵箱,將發送郵件的時間和當前系統時間進行比較差值如果小於2小時就響應用戶重置密碼界面,不然就提箱用戶該連接已失效。
使用Java實現發送郵件
使用DES加解密重置密碼連接
總觀這個發送郵件尋回密碼的功能仍是比較簡單的,多是由於作了搬運工的緣由吧~~最後是放上發郵件和使用DES加解密連接這兩個模塊供,供你們在web項目中靈活使用。博客中有任何問題,都歡迎交流哦~
參考:
javamail發送郵件:https://lrh800300.iteye.com/blog/322090
"忘記密碼"功能過程及其實現細節:https://blog.csdn.net/shansusu/article/details/43311721