Java实现邮箱找回密码 --转载
通过邮件找回密码功能的实现
1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。
2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}
重点就是如何生成这个url和如何解析这个url.
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱
3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。
数字签名 = MD5(用户名+'
’+密钥key)
数据库字段(用户名(主键),密钥key,过期时间)
url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,
url example:http://www.wechat68.com:80/CardSSHOK/checkLink?sid=K3xHOi4o/UihH5QYWBDfYA==&userName=123
生成过期时间,生成数字签名,生成url,发送邮件. AddU(用户名,密钥key,过期时间)
使用到的数据库如下

package com.soq.card.web.action; import java.sql.Timestamp;
import java.util.List;
import java.util.UUID; import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate; import com.soq.card.biz.UserHander;
import com.soq.card.entity.Users;
import com.soq.card.tools.DBhepler;
import com.soq.card.tools.Mail;
import com.soq.card.tools.Md5;
import com.soq.card.web.base.BaseAction; publicclass PassEmailAction extends BaseAction {
private Users users;
private UserHander userHander; private String email;
private String sid;
private String userName; public String sendmail() {
try {
HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate();
SessionFactory factory = ht.getSessionFactory();
Session session = factory.openSession();
Criteria criteria = session.createCriteria(Users.class);
criteria.add(Restrictions.eq("loginName", email));
List<Users> list = criteria.list();
if (list.size() > 0) {
users=list.get(0);
Mail mail = new Mail(); String secretKey = UUID.randomUUID().toString(); // 密钥
Timestamp outDate = new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数 mySql 取出时间是忽略毫秒数的 DBhepler bhepler=new DBhepler();
String sql="update users set outDate=?,validataCode=? where loginName=?;";
String str[] ={outDate+"",secretKey,users.getLoginName()};
bhepler.AddU(sql, str); //this.getUserHander().getUsersDAO().getHibernateTemplate().update(users); // 保存到数据库
System.out.println(" UserName>>>> "+users.getUserName());
String key =users.getUserName() + "$" + date + "$" + secretKey;
System.out.println(" key>>>"+key);
String digitalSignature = Md5.md5(key);// 数字签名 String path = this.getRequest().getContextPath();
String basePath = this.getRequest().getScheme() + "://"
+ this.getRequest().getServerName() + ":"
+ this.getRequest().getServerPort() + path + "/";
String resetPassHref = basePath + "checkLink?sid="
+ digitalSignature +"&userName="+users.getUserName();
String emailContent = "请勿回复本邮件.点击下面的链接,重设密码<br/><a href="
+ resetPassHref + " target='_BLANK'>" + resetPassHref
+ "</a> 或者 <a href=" + resetPassHref
+ " target='_BLANK'>点击我重新设置密码</a>"
+ "<br/>tips:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'" + key
+ "\t" + digitalSignature; mail.setTo(email);
mail.setFrom("XX");// 你的邮箱
mail.setHost("smtp.163.com");
mail.setUsername("XXX@163.com");// 用户
mail.setPassword("CXXX");// 密码
mail.setSubject("[二维码名片]找回您的账户密码");
mail.setContent(emailContent);
if (mail.sendMail()) {
System.out.println(" 发送成功");
this.getRequest().setAttribute("mesg", "重置密码邮件已经发送,请登陆邮箱进行重置!");
return "sendMail";
}
} else {
this.getRequest().setAttribute("mesg", "用户名不存在,你不会忘记邮箱了吧?");
return "noUser";
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
returnnull;
} public String checkResetLink() {
System.out.println("sid>>>" + sid); if (sid.equals("") || userName.equals("")) {
this.getRequest().setAttribute("mesg", "链接不完整,请重新生成");
System.out.println(">>>>> null");
return "error";
}
HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate();
SessionFactory factory = ht.getSessionFactory();
Session session = factory.openSession();
Criteria criteria = session.createCriteria(Users.class);
criteria.add(Restrictions.eq("userName", userName));
List<Users> list = criteria.list();
if (list.size()>0) {
users=list.get(0); Timestamp outDate = (Timestamp) users.getOutDate();
System.out.println("outDate>>>"+outDate);
if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期this.getRequest().setAttribute("mesg", "链接已经过期,请重新申请找回密码.");
System.out.println("时间 超时");
return "error";
} String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();//数字签名 System.out.println("key link》》"+key);
String digitalSignature = Md5.md5(key);// 数字签名 System.out.println("digitalSignature>>>>"+digitalSignature);
if(!digitalSignature.equals(sid)) {
this.getRequest().setAttribute("mesg", "链接不正确,是否已经过期了?重新申请吧.");
System.out.println("标示不正确");
return "error";
}else {
//链接验证通过 转到修改密码页面this.getRequest().setAttribute("user", users);
return "success";
}
}else {
this.getRequest().setAttribute("mesg", "链接错误,无法找到匹配用户,请重新申请找回密码.");
System.out.println("用户不存在");
return "error";
}
} public Users getUsers() {
return users;
} publicvoid setUsers(Users users) {
this.users = users;
} public UserHander getUserHander() {
return userHander;
} publicvoid setUserHander(UserHander userHander) {
this.userHander = userHander;
} public String getEmail() {
return email;
} publicvoid setEmail(String email) {
this.email = email;
} public String getSid() {
return sid;
} publicvoid setSid(String sid) {
this.sid = sid;
} public String getUserName() {
return userName;
} publicvoid setUserName(String userName) {
this.userName = userName;
} }

Java实现邮箱找回密码 --转载的更多相关文章
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...
- spring mvc下实现通过邮箱找回密码功能
1功能分析 通过spring mvc框架实现通过邮箱找回密码. 2 实现分析 主要是借助某个邮箱的pop3/smtp服务实现的邮件代发功能. 3 源码分析 3.1首先在用户表对应的javabean中加 ...
- AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之 ...
- JavaWeb中实现通过邮箱找回密码
在开发JavaWeb项目中,利用邮箱帮用户找回密码.效果展示: 需要一个发送邮件的jar包 : javax.mail .jar1.JSP页面(设置邮箱输入框) HTML: <p >请输 ...
- php邮箱找回密码功能
原理很简单: 用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱, 根据用户名和密码生成一个key=md5(username+password),然后$s ...
- java实现邮箱找密码
SMTP,POP3,IMAP POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电 ...
- [py][mx]django通过邮箱找回密码
忘记密码处理流程 注意: 这个文章里的找回密码页面截取有问题. 找回密码页应该是让输入邮箱 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的i ...
- django项目中使用邮箱找回密码功能
本文使用qq邮箱,需要登录邮箱,在设置-账户里面开启SMTP服务,要记下授权码 前端html {#找回密码的表单#} <form action="" method=" ...
- Django 邮箱找回密码!!!!!!!!!!!!!!!!
1.大概流程. @首先在完善登陆页面,增加忘记密码的链接. @为了账户安全,需要对操作者进行验证,向邮箱发随机数验证! @在重置验证码页面,验证验证码是否匹配(验证成功跳转至更改密码也页面). @ 重 ...
随机推荐
- Codeforce Gym 100015I Identity Checker 暴力
Identity Checker 题目连接: http://codeforces.com/gym/100015/attachments Description You likely have seen ...
- [Angular2 Router] Style the Active Angular 2 Navigation Element with routerLinkActive
You can easily show the user which route they are on using Angular 2’s routerLinkActive. Whenever a ...
- Cocos2d-x v3.0 新的事件调度方法 lambda表达式的使用
欢迎添� Cocos2d-x 交流群: 193411763 转载请注明原文出处:http://blog.csdn.net/u012945598/article/details/24603251 Coc ...
- 基于Raft构建弹性伸缩的存储系统的一些实践
基于Raft构建弹性伸缩的存储系统的一些实践 原创 2016-07-18 黄东旭 聊聊架构 最近几年来,越来越多的文章介绍了 Raft 或者 Paxos 这样的分布式一致性算法,但主要集中在算法细节和 ...
- [设计模式2]--模板(Template)模式
原文出处:http://blog.csdn.net/lwbeyond/article/details/7517679 一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务 ...
- 项目源码--Android答题类游戏源码
下载源码 技术要点: 1. 精致的答题UI 2. Android的Http通信技术 3. Android数据库QLITE与其他数据存储技术 4. Android在线音乐背景技术 5. Android答 ...
- 随机 I/O & 顺序 I/O
在谈这俩概念前.先来说说 大I/O vs. 小I/O 通常.我们把 <=16KB 的I/O认为是小I/O.而 >=32KB 的I/O认为是大I/O 了解I/O的大小.影响到 ...
- Diagram of Spring 3.0 module dependencies--转载
原文地址:http://www.ogrigas.eu/spring/2009/12/diagram-of-spring-3-0-module-dependencies As Spring 3.0.0. ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- Entity Framework之问题收集
本节讨论内容主要针对收集了上篇文章大家碰到问题的讨论解决,会持续收集扩充. DbContext加载原值,当前值,数据库值,属性操作,对象复制,对象值复制(VO,DTO->POCO),复杂对象取值 ...