总体流程
1.使用的平台
2.找回过程
3.找回相关代码
4.相关截图
5.使用的jar包
使用平台
jsp+ servlet
MySql
找回过程
- 生成密钥UUID
- 设置过期时间outdata
- 生成数字签名(由UUID、userid、outdata构成)
- 将数字签名相关参数保存至数据库
- 产生链接,发送用户邮箱
- 用户点击链接验证身份后重置密码
找回相关代码
- 获取web工程链接前缀(对应产生重置密码链接的basePath)
// 在 servlet中,arg0为HttpServletRequest对象
String path=arg0.getContextPath();
String basePath=arg0.getScheme()+"://"+arg0.getServerName()+":"+arg0.getServerPort()+path;
- 产生重置密码链接
@param ui model存储找回密码相关参数
public String createLink(model.userinfo ui,String basePath){
//生成密钥
String secretKey=UUID.randomUUID().toString();
//设置过期时间
Date outDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期
// System.out.println(System.currentTimeMillis()); //System.currentTimeMillis()相当于是毫秒为单位
long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数 mySql 取出时间是忽略毫秒数的
//此处应该更新Userinfo表中的过期时间、密钥信息
ui.setOutDate(date);
ui.setValidataCode(secretKey);
try {
userinfo.postIn(ui);
} catch (SQLException e) {
e.printStackTrace();
}
//将用户名、过期时间、密钥生成链接密钥
String key =ui.getUserid()+ "$" + date + "$" + secretKey;
String digitalSignature = MD5Util.getMd5(key);// 数字签名
String resetPassHref = basePath + "/toFindPassword3?sid="+ digitalSignature +"&id="+ui.getUserid();
String emailContent = resetPassHref+ "\n"+"请勿回复本邮件.点击下面的链接,重设密码,本邮件超过30分钟,链接将会失效,需要重新申请找回密码." ;
return emailContent;
}
3.发送带链接邮件
// 发件人的邮箱账号如:xxx@163.com
public static String sendEmailAccount = "你的邮箱";
// 发件人的邮箱的授权码(自己在邮箱服务器中开启并设置)
public static String sendEmailPassword = "你的邮箱授权码";
// 发件人邮箱的SMTP服务器地址,如:smtp.163.com
public static String sendEmailSMTPHost = "smtp.qq.com";
// 收件人的邮箱账号
public static String receiveMailAccount = "";
// 把发送邮件封装为函数,参数为收件人的邮箱账号和要发送的内容
public boolean sendMail(String receiveMailAccount, String mailContent,String Subject) {
boolean result=false;
// 创建用于连接邮件服务器的参数配置
Properties props = new Properties();
// 设置使用SMTP协议
props.setProperty("mail.transport.protocol", "smtp");
// 设置发件人的SMTP服务器地址
props.setProperty("mail.smtp.host", sendEmailSMTPHost);
// 设置需要验证
props.setProperty("mail.smtp.auth", "true");
// 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
// 设置debug模式,便于查看发送过程所产生的日志
// session.setDebug(true);
try {
// 创建一封邮件
MimeMessage message = createMimeMessage(session, sendEmailAccount, receiveMailAccount, mailContent,Subject);
// 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
transport.connect(sendEmailAccount, sendEmailPassword);
// 发送邮件, 发到所有的收件地址, 通过message.getAllRecipients() 可以获取到在创建邮件对象时添加的所有收件人
transport.sendMessage(message, message.getAllRecipients());
// 关闭连接
transport.close();
//判断是否发送成功
result=true;
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
*
* @param session
* 和服务器交互的会话
* @param sendMail
* 发件人邮箱
* @param receiveMail
* 收件人邮箱
* @return
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,
String mailContent,String Subject) throws Exception {
// 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 设置发件人姓名和编码格式
message.setFrom(new InternetAddress(sendMail, "小何", "UTF-8"));
// 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "尊敬的用户", "UTF-8"));
// 设置邮件主题
message.setSubject(Subject, "UTF-8");
// 设置邮件正文
message.setContent(mailContent, "text/html;charset=UTF-8");
// 设置发件时间
message.setSentDate(new Date());
// 保存设置
message.saveChanges();
return message;
}