【JavaWeb】通过邮件找回密码
前言
本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路。整个实现过程中最重要的就是以下三点:
- 如何发送邮件到用户指定邮箱
- 邮件中的重置密码链接构成是怎么样的
- 验证重置密码链接的合法性(是否过期)
先来个实现的效果展示吧,然后再仔细分析如何去实现各个部分:
效果展示
(这里盗用下我们小组作品成果的前端)
用户输入注册时的邮箱账户获取重置密码的链接


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

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


如何发送邮件给用户指定的邮箱
在整体看了效果之后,我们就来逐步分析功能实现。首先是发邮件,这个功能我借用了一位博主写好的代码,这虽然是他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加密算法](<https://www.cnblogs.com/myworld7/p/10596869.html>)(羞耻地推荐一波)
关于生成重置密码链接的完整代码我准备放在和验证重置链接的代码一起给出,因为生成链接是加密而验证链接是解密,加解密一起看思路会更清晰一点。
验证重置链接的合法性
这个的实现思路就很简单了,提取链接中的参数key的值,然后使用des解密出明文。分割明文字符串为发送邮件的时间和用户邮箱,将发送邮件的时间和当前系统时间进行比较差值若是小于2小时就响应用户重置密码界面,否则就提箱用户该链接已失效。
相关demo地址
使用Java实现发送邮件
使用DES加解密重置密码链接
小结
总观这个发送邮件寻回密码的功能还是比较简单的,可能是因为做了搬运工的原因吧~~最后是放上发邮件和使用DES加解密链接这两个模块供,供大家在web项目中灵活使用。博客中有任何问题,都欢迎交流哦~
参考:
javamail发送邮件:https://lrh800300.iteye.com/blog/322090
JavaMail API下载地址:https://www.oracle.com/technetwork/java/javamail/javamail145-1904579.html
"忘记密码"功能过程及其实现细节:https://blog.csdn.net/shansusu/article/details/43311721
【JavaWeb】通过邮件找回密码的更多相关文章
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
- 通过邮件找回密码功能的Java实现
1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人 ...
- SpringMVC通过邮件找回密码功能的实现
1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密 ...
- Jsp邮件找回密码全攻略
[来源网络 http://www.2cto.com/kf/201502/376374.html] 一般大型网站我们登录的时候,密码忘了都有个功能可以找回密码. 细数下大致的方法: 1.直接把密码发送 ...
- (进阶篇)PHP+Mysql+jQuery找回密码
通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密 ...
- Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- PHP会员找回密码功能实现实例介绍
设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3. ...
- PHP+Mysql+jQuery找回密码
通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密 ...
随机推荐
- Redis学习笔记——Redis的基本操作
之前介绍过如何在ubuntu安装Redis服务器:https://www.cnblogs.com/zifeiy/p/9062738.html 接下来,我们在Redis上进行一些基本的操作. 所县使用命 ...
- IDA7.2破解版本
更新说明 https://www.hex-rays.com/products/ida/7.2/index.shtml 破解文章 作者阐述了一下对IDA安装密码的攻击方法,通过枚举多种语言默认的随机数发 ...
- 高级UI-RecyclerView间隔线添加
上文讲到了RecyclerView的简单使用,知道RecycleView是怎么使用的了,那么这一节将基于上一届的内容继续改进,在ListView中很轻松就能实现的间隔线,在RecycleView中也需 ...
- 根据start和limit从已有的数据列表中获取从start开始的limit个数据
代码记录(需求:根据start和limit从已有的数据列表中获取从start开始的limit个数据) 已有的数据列表:这个数据列表是经过处理的,可能是在SQL查询时无法处理的如多条件排序,而排序条件需 ...
- MySQL安装时出现的问题
mysql正常安装结束之后需要连接你所安装的数据库的时候出现下面的错误: Client does not support authentication protocol requested by se ...
- [转帖]18W喂不饱有必要买30W充电器吗?iPhone 11 Pro Max充电评测
18W喂不饱有必要买30W充电器吗?iPhone 11 Pro Max充电评测 https://www.cnbeta.com/articles/tech/895237.htm 改天买一个 设备玩一玩 ...
- ota编译及差分包制作
OTA L 版本OTA build diff OTA升级的步骤如下: 1.new整个project. 2.Step1: ./vendor/mediatek/proprietary/scripts/si ...
- Redis学习笔记(一):Redis的数据类型
之前笔者常常接触的数据库是关系型数据库,其中MySQL接触居多.近年来NoSQL兴起,各种新型数据库不断诞生,redis就是NoSQL中的一种热门数据库. 注:此类文章仅仅作为笔者的学习和阅读积累,若 ...
- 《Mysql - 事务 MVCC》
一:前言 - 前面通过 <Mysql 事务 - 隔离> 的学习,知道了事务的实现,是根据 获取一致性视图 来实现的. 二:那么,什么时候会获取到一致性视图呢? - 例如:有三个事务,启动的 ...
- Java:HashMap的实现原理(JDK1.8)
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...