最近为认证系统添加了忘记密码功能,使用了Spring提供的邮件API和Ehcache缓存验证码。整个过程还是挺有趣,值得写一下。
Spring邮件API
Sprin提供了一个强大方便的邮件API,简化了发送邮件的工作。可以发送富文本邮件,添加附件,使用模板渲染邮件内容。推荐看Spring实战(第三版),这里只简单讲一下如何发送富文本邮件,其他的就不细讲了。
配置邮件发送器
Spring邮件API的核心是MailSender
接口,Spring自带JavaMailSenderImpl
实现了MailSender
接口,所以需要将JavaMailSenderImpl
装配到容器中。
Mail.xml
|
|
Mail.properties
使用QQ的邮件服务器,需要在QQ邮箱设置中开启STMP服务
|
|
Main.Java
这只是简单的构造了一个带有链接的邮件,其他更复杂的用法就不介绍了。
|
|
至此一封邮件就发送出去了,可以坐等收件人查看了。
Ehcache缓存
Spring中内置了对Ehcache的支持,封装了EhCacheCacheManager
,可以很方便的使用Ehcache。
配置CacheManager
|
|
ehcache.xml
Ehcache的配置文件,这里配置一个名为CodeCache的chahe用于保存验证码。
Main.java
Ehcache的基本用法。
忘记密码功能实现
上面已经把关键点介绍了,剩余的就是如何组织代码,设计密码找回流程。代码很简单就不贴出了。
1. 显示忘记密码页面
一个简单的表单页面,输入用户名和一个60秒刷新一次的验证码。
- 需要验证用户名是否存在,邮箱是否已填写。
- 60秒刷新的验证码防止恶意重置密码。
- 60秒刷新的验证码实现方式有很多,可以把时间信息存在session或cookie或Ehcache中。
2. 发送邮件,缓存重置密码令牌。
- 生成一个5分钟内有效的令牌,将令牌和用户id映射保存在Ehcache中。
- 用令牌值组成重置邮件链接。
- 从数据库取出邮件地址并发送邮件。
3. 重置密码
- 用户点击链接进入重置密码界面。
- 验证令牌值,并得到用户Id,定位到具体用户。
- 用户修改密码。
总结
忘记密码功能实现起来比较简单,但是如何设计一个严密的密码找回功能很麻烦。现在这个流程就很薄弱,容易受到攻击。等后面有时间了再来仔细研究一下,添加一些验证条件,比如密保问题,手机号验证这些。