通过邮件找回密码

前言

本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路。整个实现过程中最重要的就是以下三点:

  • 如何发送邮件到用户指定邮箱
  • 邮件中的重置密码链接构成是怎么样的
  • 验证重置密码链接的合法性(是否过期)

先来个实现的效果展示吧,然后再仔细分析如何去实现各个部分:

效果展示

(这里盗用下我们小组作品成果的前端)

用户输入注册时的邮箱账户获取重置密码的链接

用户登录自己的邮箱查看邮件

用户点击重置密码链接,如果在重置链接有效期内我们跳转到重置密码界面,否则提醒用户该链接已过期

如何发送邮件给用户指定的邮箱

在整体看了效果之后,我们就来逐步分析功能实现。首先是发邮件,这个功能我借用了一位博主写好的代码,这虽然是他09年写的,但是实现效果依旧很好。代码中的注释也很详细,我也不用再多做解释(实际情况是,我也没有太认真去读该代码,只是当了一个搬运工,哈哈~)。文末附上了该博主的博客链接。我发送邮件的demo可见github:

然后介绍下在使用过程遇见的坑,不出意外十有八九大家都会遇见。主要有两个:

认证错误:javax.mail.AuthenticationFailedException

也就是报错如下:

这也是因为,在填写发送邮件的密码时,应该使用授权码,而不是密码!!!

邮件内容不合法:com.sun.mail.smtp.SMTPSendFailedException: 554

这个是因为你的邮件被网易邮箱(我用的是网易邮箱发邮件)识别成垃圾邮件,然后就不会给你发。我的解决办法是,修改邮件的内容,仅包含少量的提示信息和重置密码链接。这样就成功地发送了。

如何发送邮件这个问题解决,那么下一步就是,邮件中的重置密码链接应该是怎样?

包导入出错

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小时就响应用户重置密码界面,否则就提箱用户该链接已失效。

相关demo地址

小结

总观这个发送邮件寻回密码的功能还是比较简单的,可能是因为做了搬运工的原因吧~~最后是放上发邮件和使用DES加解密链接这两个模块供,供大家在web项目中灵活使用。博客中有任何问题,都欢迎交流哦~

参考:

原文地址:https://www.cnblogs.com/myworld7/p/11066466.html

时间: 2024-10-05 03:11:09

通过邮件找回密码的相关文章

用户邮件找回密码实现

改天我在写详细注释吧,代码先贴出来,注释很明白了,应该无需多言. 1 Controller代码: 2 public ActionResult ForgotPassword() 3 { 4 return View(); 5 } 6 [ActionName("ForgotPassword"),HttpPost] 7 public ActionResult ForgotPasswordPost(ForgotPasswordModel model) 8 { 9 if (ModelState.I

Jsp邮件找回密码全攻略

[来源网络  http://www.2cto.com/kf/201502/376374.html] 一般大型网站我们登录的时候,密码忘了都有个功能可以找回密码. 细数下大致的方法: 1.直接把密码发送到你的邮箱去.一般是临时密码. 2.短信验证,成本较高. 3.密保问题 4.发送一个链接到你邮箱点击即可更改密码. 个人认为第四种方法最经济实惠,这次也主要都是在搞这个. 搞了一个晚上,单单邮件发送功能写了快300行,虽然很多是注释和空格,被舍友一说,用python只写了20几行,不禁膜拜PYTHO

SpringMVC通过邮件找回密码功能的实现

1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 3.加密能防止伪造攻击,一次url只能验证一次,

通过邮件重置密码

目前大部分用户注册的密码都是使用MD5实现加密,而MD5加密确实不可逆的,若要解密MD5加密之后的数据,则使用碰撞的方法,不过效率太低,概率小,因此用户忘记密码之后只能通过重置新密码(!=找回密码) 邮件找回密码前提: 用户注册的时候必须进行邮箱验证: 邮件找回密码流程: 注册一个邮箱,用于给用户发邮件(相当于发件人): 先输入用户名验证用户是否存在(用户名是唯一的): 输入邮箱,根据用户名和邮箱验证用户的邮箱是否正确,若不正确则让用户重新输入,否则往下走: 发送链接到用户邮箱,链接中存有key

PHP会员找回密码功能实现实例介绍

设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3.系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678). 4.系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名.临时密码.提醒用户及时修改临时密码的提示语). 5.用户用临时密码即可登录. HTML 我们在找回密码的页面上放置

Java实现邮箱找回密码

[来源网络:http://www.cnblogs.com/zyw-205520/p/3738439.html] 通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url.

Java实现邮箱找回密码 --转载

通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱 3.加密能防止

忘记密码 通过邮件找回

解决用户忘记密码 ,通过发邮件找回 @Action("send") public String sendMail() { accountServices.sendForgetMail(email); return SUCCESS; } // 通过数据库查询输入框中email的账号,有了这个账号再真正发送, // 在线程里的属性要写成常量 public void sendForgetMail(final String email) { Account account = accountD

PHPMail 发邮件(网站找回密码模块开发)

1.用户验证 验证用户名是否是已注册会员.一般用ajax验证数据库User表. ajax代码如下: $('[name=cpname]').blur(function(){ var re = /^\w{6,12}$/; if(re.test($(this).val())){ //ajax连接数据库验证 $.ajax({ url:'Cp/check_cpname/cpname/'+$('[name=cpname]').val(), type:'get', success:function($msg)