具体内容如下

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实现邮件找回密码功能相关推荐

  1. 找回密码功能 java_Java实现邮件找回密码功能

    本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回, ...

  2. javaWeb实现使用邮箱邮件找回密码功能

    JSP+Jmail+JavaBean 发邮件(转)2010-08-23 18:052007年04月14日 14:32/* * SendMail.java * * Created on 2007年3月3 ...

  3. java通过邮件找回密码_SpringMVC实现通过邮件找回密码功能

    最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. ...

  4. java实现通过绑定邮箱找回密码功能_SpringMVC通过邮件找回密码功能的实现

    1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密 ...

  5. 通过邮件找回密码功能的实现

    .最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回. 通过java发送邮件的功能我就不说了,重点讲找回密 ...

  6. 阿里主机wordpress注册收不到邮件,WordPress用邮件找回密码功能

    问题说明 在我们使用阿里云的云虚拟主机搭建WordPress站点时,里面的邮件发送即使设置好了,也发送不了邮件.注:阿里云的主机都是通过SMTP来进行发送邮件的,需要开启主机的fsockopen.但是 ...

  7. java 邮箱找回密码_【JavaWeb】通过邮件找回密码

    前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...

  8. django重置密码发送html邮件,Django实现发送邮件找回密码功能

    在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加 ...

  9. python 发邮件 无需密码_Django实现发送邮件找回密码功能

    在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加 ...

最新文章

  1. 输出nginx执行过程中函数调用关系
  2. ajax怎么在html与php中使用,如何使用ajax和php将数据从数据库表放到html表
  3. leetcode37. 解数独
  4. 吴恩达《机器学习》学习笔记一——初识机器学习
  5. 微软免费软件项目DreamSpark更名为Microsoft Imagine
  6. 初识vue之axios的封装
  7. 天,又有人找我帮忙!
  8. C# NFine开源框架 调用存储过程的实现代码
  9. 图解CSS3 读书笔记——边框
  10. 《第一本Docker书》 读书笔记
  11. window media player 内部应用程序出错
  12. 台式计算机开机慢,台式机电脑开机启动半天才能开机怎么回事_台式机电脑开机启动慢很久如何解决-系统城...
  13. Alibaba内部首发“M8级”500页微服务架构手册,GitHub上杀疯了
  14. glusterfs分布式文件系统详细原理
  15. 又一家云服务关停,这回是网易
  16. ArcGIS教程:什么是格网和经纬网?
  17. LLM__llama-7B模型试验
  18. 腾讯阿里O2O布局:一个偏2C一个偏2B
  19. msvcp100d.dll
  20. H5移动端开发基础(三)自定义滚动条、实战-音悦台

热门文章

  1. 8个影响我职业生涯的重要技能
  2. 通过iter_rows()读取excel数据
  3. linux创建快捷方式
  4. 无线蓝牙耳机性价比排行_2022最值得入手的蓝牙耳机推荐
  5. 打印机清洁墨盒的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  6. 分享:新入职时,如何快速熟悉一个项目的代码
  7. 联阳(ite) IT66021FN
  8. JDK各版本新特性(更新到Java20)
  9. API_QQ头像获取接口,腾讯QQ头像获取直链
  10. 四川计算机专业三本大学排名,2021四川三本大学排名 三本院校有哪些