本文将介绍忘记密码时经过发送重置密码邮件找回密码的实现思路。整个实现过程当中最重要的就是如下三点: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