Java实现邮件找回密码功能
具体内容如下
1、有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。
2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}
重点就是如何生成这个url和如何解析这个url.
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url
3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。
数字签名 = MD5(用户名+'$'+过期时间+'$'+密钥key)
数据库字段(用户名(主键),密钥key,过期时间)
url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77
&userName=test4
生成过期时间,生成数字签名,生成url,发送邮件.saveOrUpdate(用户名,密钥key,过期时间)
以下为springMvc代码
@requestmapping(value = "/user/i_forget_password")
@responsebody
public map forgetpass(httpservletrequest request,string username){users users = userservice.finduserbyname(username);map map = new hashmap<string ,string >();string msg = "";if(users == 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; //忽略毫秒数users.setvalidatacode(secretkey);users.setregisterdate(outdate);userservice.update(users); //保存到数据库string key = users.getusername()+"$"+date+"$"+secretkey;string digitalsignature = md5.md5encode(key); //数字签名string emailtitle = "有方云密码找回";string path = request.getcontextpath();string basepath = request.getscheme()+"://"+request.getservername()+":"+request.getserverport()+path+"/";string resetpasshref = basepath+"user/reset_password?sid="+digitalsignature+"&username="+users.getusername();string emailcontent = "请勿回复本邮件.点击下面的链接,重设密码<br/><a href="+resetpasshref +" rel="external nofollow" target='_blank'>点击我重新设置密码</a>" +"<br/>tips:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'"+key+"\t"+digitalsignature;system.out.print(resetpasshref);sendmail.getinstatnce().sendhtmlmail(emailtitle,emailcontent,users.getemail());msg = "操作成功,已经发送找回密码链接到您邮箱。请在30分钟内重置密码";loginfo(request,username,"申请找回密码");}catch (exception e){e.printstacktrace();msg="邮箱不存在?未知错误,联系管理员吧。";}map.put("msg",msg);return map;
}
找回链接已经发到邮箱了。进入邮箱点开链接
以下为链接检验代码,验证通过 跳转到修改密码界面,否则跳转到失败界面
@RequestMapping(value = "/user/reset_password",method = RequestMethod.GET)
public ModelAndView checkResetLink(String sid,String userName){ModelAndView model = new ModelAndView("error");String msg = "";if(sid.equals("") || userName.equals("")){msg="链接不完整,请重新生成";model.addObject("msg",msg) ;logInfo(userName,"找回密码链接失效");return model;}Users users = userService.findUserByName(userName);if(users == null){msg = "链接错误,无法找到匹配用户,请重新申请找回密码.";model.addObject("msg",msg) ;logInfo(userName,"找回密码链接失效");return model;}Timestamp outDate = users.getRegisterDate();if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期msg = "链接已经过期,请重新申请找回密码.";model.addObject("msg",msg) ;logInfo(userName,"找回密码链接失效");return model;}String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode(); //数字签名String digitalSignature = MD5.MD5Encode(key);System.out.println(key+"\t"+digitalSignature);if(!digitalSignature.equals(sid)) {msg = "链接不正确,是否已经过期了?重新申请吧";model.addObject("msg",msg) ;logInfo(userName,"找回密码链接失效");return model;}model.setViewName("user/reset_password"); //返回到修改密码的界面model.addObject("userName",userName);return model;
}
补充1:Timestamp类型对象在保存到数据的时候 毫秒精度会丢失。比如:2013-10-08 10:29:10.234
存到mysql数据库的时候 变成 2013-10-08 10:29:10.0。时间变得不相同了,sid 匹配的时候不会相等。
所以我做了忽略精度的操作。
补充2:解决linux下面title中文乱码 sun.misc.BASE64Encoder enc = new
sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(),
“UTF-8”, “B”)); //解决linux邮件title乱码
补充3:怎么不直接把sid插入到user表呢。验证的时候直接比较sid就ok了。
原文链接:https://blog.csdn.net/Jerome_s/article/details/43236505
Java实现邮件找回密码功能相关推荐
- 找回密码功能 java_Java实现邮件找回密码功能
本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回, ...
- javaWeb实现使用邮箱邮件找回密码功能
JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...
- java通过邮件找回密码_SpringMVC实现通过邮件找回密码功能
最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. ...
- java实现通过绑定邮箱找回密码功能_SpringMVC通过邮件找回密码功能的实现
1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密 ...
- 通过邮件找回密码功能的实现
.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回. 通过java发送邮件的功能我就不说了,重点讲找回密 ...
- 阿里主机wordpress注册收不到邮件,WordPress用邮件找回密码功能
问题说明 在我们使用阿里云的云虚拟主机搭建WordPress站点时,里面的邮件发送即使设置好了,也发送不了邮件.注:阿里云的主机都是通过SMTP来进行发送邮件的,需要开启主机的fsockopen.但是 ...
- java 邮箱找回密码_【JavaWeb】通过邮件找回密码
前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...
- django重置密码发送html邮件,Django实现发送邮件找回密码功能
在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加 ...
- python 发邮件 无需密码_Django实现发送邮件找回密码功能
在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加 ...
最新文章
- 输出nginx执行过程中函数调用关系
- ajax怎么在html与php中使用,如何使用ajax和php将数据从数据库表放到html表
- leetcode37. 解数独
- 吴恩达《机器学习》学习笔记一——初识机器学习
- 微软免费软件项目DreamSpark更名为Microsoft Imagine
- 初识vue之axios的封装
- 天,又有人找我帮忙!
- C# NFine开源框架 调用存储过程的实现代码
- 图解CSS3 读书笔记——边框
- 《第一本Docker书》 读书笔记
- window media player 内部应用程序出错
- 台式计算机开机慢,台式机电脑开机启动半天才能开机怎么回事_台式机电脑开机启动慢很久如何解决-系统城...
- Alibaba内部首发“M8级”500页微服务架构手册,GitHub上杀疯了
- glusterfs分布式文件系统详细原理
- 又一家云服务关停,这回是网易
- ArcGIS教程:什么是格网和经纬网?
- LLM__llama-7B模型试验
- 腾讯阿里O2O布局:一个偏2C一个偏2B
- msvcp100d.dll
- H5移动端开发基础(三)自定义滚动条、实战-音悦台