spring mvc下实现通过邮箱找回密码功能
1功能分析
通过spring mvc框架实现通过邮箱找回密码。
2 实现分析
主要是借助某个邮箱的pop3/smtp服务实现的邮件代发功能。
3 源码分析
3.1首先在用户表对应的javabean中加入两个字段outdate和validatecode用于验证数字签名。
private String validatacode;
private Date outdate;
@Column(name = "validatacode", length = 50)
public String getValidatacode() {
return validatacode;
} public void setValidatacode(String validatacode) {
this.validatacode = validatacode;
}
@Column(name = "outdate", length = 50)
public Date getOutdate() {
return outdate;
} public void setOutdate(Date outdate) {
this.outdate = outdate;
}
3.2发送邮件工具类
package util;
import java.security.GeneralSecurityException;
import java.util.Properties; import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage; import com.sun.mail.util.MailSSLSocketFactory; public class SendmailUtil { // 设置服务器
private static String KEY_SMTP = "mail.smtp.host";
private static String VALUE_SMTP = "smtp.163.com";//邮箱服务器地址
// 服务器验证
private static String KEY_PROPS = "mail.smtp.auth";
private static boolean VALUE_PROPS = true;
// 发件人用户名、密码
private String SEND_USER = "填你用来做发送邮件的邮箱";
private String SEND_UNAME = "发件人用户名";
private String SEND_PWD = "*****";//这里是关键,是你开通了pop3/smtp服务以后获得的授权码
// 建立会话
private MimeMessage message;
private Session s; /*
* 初始化方法
*/
public SendmailUtil() throws GeneralSecurityException {
Properties props = System.getProperties();
props.setProperty(KEY_SMTP, VALUE_SMTP);
props.put(KEY_PROPS, "true");
props.put("mail.smtp.auth", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
s = Session.getDefaultInstance(props, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(SEND_UNAME, SEND_PWD);
}});
s.setDebug(true);
message = new MimeMessage(s);
} /**
* 发送邮件
*
* @param headName
* 邮件头文件名
* @param sendHtml
* 邮件内容
* @param receiveUser
* 收件人地址
*/
public void doSendHtmlEmail(String headName, String sendHtml,
String receiveUser) {
try {
// 发件人
InternetAddress from = new InternetAddress(SEND_USER);
message.setFrom(from);
// 收件人
InternetAddress to = new InternetAddress(receiveUser);
message.setRecipient(Message.RecipientType.TO, to);
// 邮件标题
message.setSubject(headName);
String content = sendHtml.toString();
// 邮件内容,也可以使纯文本"text/plain"
message.setContent(content, "text/html;charset=GBK");
message.saveChanges();
Transport transport = s.getTransport("smtp");
// smtp验证,就是你用来发邮件的邮箱用户名密码
transport.connect(VALUE_SMTP, SEND_UNAME, SEND_PWD);
// 发送
transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("send success!");
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
} }
3.3 spring mvc发送邮件
首先要有前台页面,填写邮箱或用户名,示例图如下:

jsp页面代码:
<div class="container">
<div class="col-md-12">
<h1 class="margin-bottom-15">重置您的密码</h1>
<form class="form-horizontal templatemo-forgot-password-form templatemo-container" role="form" action="javascript:findpwd();" method="post">
<div class="form-group">
<div class="col-md-12">
请输入邮箱或用户名,点击确定。找回密码链接将发送至您的邮箱
</div>
</div>
<div class="form-group">
<div class="col-md-12">
<input type="text" class="form-control" id="yhmoryx" placeholder="您的邮箱账号或用户名">
</div>
</div>
<div class="form-group">
<div class="col-md-12">
<input type="submit" value="确定" class="btn btn-danger">
<br><br>
<a href="#">无需重置密码,现在登录?</a>
<!--<a href="login-2.html">用户名和注册邮箱已忘记,进行账号申诉?</a>-->
</div>
</div>
</form>
</div>
</div>
后台接收请求代码:
@RequestMapping(value = "/user/forgetpwd")
@ResponseBody
public Map forgetPass(HttpServletRequest request,@RequestParam("yhmoryx") String yhmoryx,Model model){
XtYh xtYh=xtYhService.getXtYhByYhmSjYx(yhmoryx);
Map<String, String> map = new HashMap<String ,String >();
String msg = "";
if(yhmoryx.equals("")){ //用户名不存在
msg = "请输入用户名或邮箱!";
map.put("msg",msg);
return map;
}
if(xtYh == null){ //用户不存在
msg = "用户名不存在,你不会忘记用户名了吧?";
map.put("msg",msg);
return map;
}
try{
String secretKey= UUID.randomUUID().toString(); //密钥
Timestamp outDate = new Timestamp(System.currentTimeMillis()+30*60*1000);//30分钟后过期
long date = outDate.getTime()/1000*1000; //忽略毫秒数
xtYh.setValidatacode(secretKey);
xtYh.setOutdate(outDate);
xtYhService.updateXtYh(xtYh); //保存到数据库
String key = xtYh.getYhm()+"$"+date+"$"+secretKey;
String digitalSignature = Md5.MD5Encode(key); //数字签名 String emailTitle = "密码找回";
String path = request.getContextPath();
String localstr=request.getLocalAddr();
System.out.println(localstr);
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String resetPassHref = basePath+"resetpassword/user/resetpassword?sid="+digitalSignature+"&yhm="+xtYh.getYhm();
String emailContent = "请勿回复本邮件.点击下面的链接,重设密码<br/><a href="+resetPassHref +" target='_BLANK'>点击我重新设置密码</a>" +
"<br/>tips:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'"+"<br/>tips:本链接可能被邮箱拦截,如链接无效,请复制下列链接到您的浏览器中。<br/>"+
"链接开始:<span style='color:#F00; font-weight:bold'>"+resetPassHref+"<span>链接结束";
//
SendmailUtil.class.newInstance().doSendHtmlEmail(emailTitle,emailContent,xtYh.getYx());//调用工具类里面的发送发放
msg = "操作成功,已经发送找回密码链接到您邮箱。请在30分钟内重置密码";
}catch (Exception e){
e.printStackTrace();
msg="邮箱不存在?";
}
map.put("msg",msg);
return map;
}
3.4 发送邮件以后用户点击链接(即上述的resetPassHref)再转到服务器上spring mvc的控制器部分,根据发回来的用户名和数字签名进行处理。
确定以后会执行发送邮件功能,邮箱中接收到的信件如下:

点击链接,会将请求发送到下面的控制器中进行处理:
@RequestMapping(value = "/user/resetpassword",method = RequestMethod.GET)
public String checkResetLink(@RequestParam("sid") String sid,@RequestParam("yhm")String yhm,Model model){
System.out.println(sid+yhm);
String msg = "";
if(sid.equals("") || yhm.equals("")){
msg="链接不完整,请重新生成";
model.addAttribute("msg",msg);
return "findPwdError";
} XtYh xtYh=xtYhService.getXtYhByYhm(yhm);
if(xtYh == null){
msg = "链接错误,无法找到匹配用户,请重新申请找回密码.";
model.addAttribute("msg",msg) ;
return "findPwdError";
}
Date outDate = xtYh.getOutdate();
if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期
msg = "链接已经过期,请重新申请找回密码.";
model.addAttribute("msg",msg) ;
return "findPwdError";
}
String key = xtYh.getYhm()+"$"+outDate.getTime()/1000*1000+"$"+xtYh.getValidatacode(); //数字签名
String digitalSignature = Md5.MD5Encode(key);
System.out.println(key+"\t"+digitalSignature);
if(!digitalSignature.equals(sid)) {
msg = "链接不正确,是否已经过期了?重新申请吧";
model.addAttribute("msg",msg);
return "findPwdError";
} model.addAttribute("userName",yhm);
return "resetpage";
}
4 再写一个update用户的操作。在上一步把用户的用户名(或id)传到前台页面,写一个input隐藏域。用户更改完以后点击确定,再把值传到后台,写入数据库。
以下是点击链接以后的页面

填入新密码,点击确定,跳转到登录界面

【注:】参考至其他大神的博客。具体地址没记,去搜狗一下应该能找到
spring mvc下实现通过邮箱找回密码功能的更多相关文章
- django项目中使用邮箱找回密码功能
本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码 前端html {#找回密码的表单#} <form action="" method=" ...
- php邮箱找回密码功能
原理很简单: 用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱, 根据用户名和密码生成一个key=md5(username+password),然后$s ...
- AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
- Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- PHP会员找回密码功能实现实例介绍
设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的“找回密码”超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3. ...
- SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选、检索功能(maven)
SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选.检索功能(maven) 本篇是新建的一个数据库,新建的一个完整项目. 本篇内容: (1)使用 Spri ...
- PHP会员找回密码功能的简单实现
文章来自:博客 http://www.jb51.net/article/91944.htm 设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名 ...
随机推荐
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- Manjaro 安装教程
1 概述 本文讲述了如何在单硬盘下对Manjaro进行安装. 2 写U盘 首先第一步是下载镜像,官网下载地址戳这里,如果下载速度慢可以选择国内镜像,比如戳这里. 笔者选择的是XFCE桌面: 下载好后将 ...
- IDEA - 返回上一步,回到下一步 代码 快捷键
回到上一步 ctrl + alt + < 回到下一步 ctrl + alt + >
- Day01_01_java背景
1.Java背景 --由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称. --Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当 ...
- 2021S软件工程——个人阅读作业1
2021S软件工程--个人阅读作业1 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任建) 这个作业的要求在哪里 2021年软工-热身阅读作业 我在这个课程的目标是 了解并熟悉软件开发 ...
- 基于MATLAB的手写公式识别(8)
从一个无知角落里开始,蹒跚学步,一个未知到另一个未知,在跌跌撞撞中越走越快,越走越远,最后宇宙也为之开源.对于探索者来说,最后他们的思想总是变得和自己的足迹一样伟大. 1.图像的预处理 1.1图像 ...
- JavaScript数组详解-全网最全
定义数组的方式 定义数组的方式有多种,分别如下 let array=[] (字面量) let array=new Array() let array=new Array([length]) lengt ...
- OAuth2(未完待续)
一.OAuth2是什么?OAuth2解决了什么问题 1.OAuth2是第三方授权协议,用于支撑认证和授权 2.OAuth2中的角色划分: 资源拥有者 客户端 资源服务器 授权服务器 二.OAuth2怎 ...
- Windows系统之间文件互传
1)利用Windows自带的文件共享服务 本次试验以Win7为服务器端,win10为客户端 1.确保Win7服务端开启对应的服务及开放相应的端口号 进入命令行界面,输入netstat -an,查看44 ...
- 分子动力学模拟软件VMD的安装与使用
技术背景 在分子动力学模拟过程中会遇到一些拓扑结构非常复杂的分子模型,所谓的复杂不仅仅是包含众多的原子,还有各种原子之间的成键关系与成键类型等.这时候就非常能够体现一个好的可视化软件的重要性了,这里我 ...