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

2、参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}

重点就是如何生成这个url和如何解析这个url.

需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url

3、加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。

数字签名 = MD5(用户名+'$'+过期时间+‘$’+密钥key)

数据库字段(用户名(主键),密钥key,过期时间)

url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,

生成过期时间,生成数字签名,生成url,发送邮件. saveOrUpdate(用户名,密钥key,过期时间)

以下为springMvc代码

1 @RequestMapping(value = "/user/i_forget_password")2 @ResponseBody3 publicMap forgetPass(HttpServletRequest request,String userName){4 Users users =userService.findUserByName(userName);5 Map map = new HashMap();6 String msg = "";7 if(users == null){ //用户名不存在

8 msg = "用户名不存在,你不会忘记用户名了吧?";9 map.put("msg",msg);10 returnmap;11 }12 try{13 String secretKey= UUID.randomUUID().toString(); //密钥

14 Timestamp outDate = new Timestamp(System.currentTimeMillis()+30*60*1000);//30分钟后过期

15 long date = outDate.getTime()/1000*1000; //忽略毫秒数

16 users.setValidataCode(secretKey);17 users.setRegisterDate(outDate);18 userService.update(users); //保存到数据库

19 String key = users.getUserName()+"$"+date+"$"+secretKey;20 String digitalSignature = MD5.MD5Encode(key); //数字签名

21

22 String emailTitle = "有方云密码找回";23 String path =request.getContextPath();24 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";25 String resetPassHref = basePath+"user/reset_password?sid="+digitalSignature+"&userName="+users.getUserName();26 String emailContent = "请勿回复本邮件.点击下面的链接,重设密码点击我重新设置密码" +

27 "
tips:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'"+key+"\t"+digitalSignature;28 System.out.print(resetPassHref);29 SendMail.getInstatnce().sendHtmlMail(emailTitle,emailContent,users.getEmail());30 msg = "操作成功,已经发送找回密码链接到您邮箱。请在30分钟内重置密码";31 logInfo(request,userName,"申请找回密码");32 }catch(Exception e){33 e.printStackTrace();34 msg="邮箱不存在?未知错误,联系管理员吧。";35 }36 map.put("msg",msg);37 returnmap;38 }

找回链接已经发到邮箱了。进入邮箱点开链接

以下为链接检验代码,验证通过 跳转到修改密码界面,否则跳转到失败界面

1 @RequestMapping(value = "/user/reset_password",method =RequestMethod.GET)2 publicModelAndView checkResetLink(String sid,String userName){3 ModelAndView model = new ModelAndView("error");4 String msg = "";5 if(sid.equals("") || userName.equals("")){6 msg="链接不完整,请重新生成";7 model.addObject("msg",msg) ;8 logInfo(userName,"找回密码链接失效");9 returnmodel;10 }11 Users users =userService.findUserByName(userName);12 if(users == null){13 msg = "链接错误,无法找到匹配用户,请重新申请找回密码.";14 model.addObject("msg",msg) ;15 logInfo(userName,"找回密码链接失效");16 returnmodel;17 }18 Timestamp outDate =users.getRegisterDate();19 if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期

20 msg = "链接已经过期,请重新申请找回密码.";21 model.addObject("msg",msg) ;22 logInfo(userName,"找回密码链接失效");23 returnmodel;24 }25 String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode(); //数字签名

26 String digitalSignature =MD5.MD5Encode(key);27 System.out.println(key+"\t"+digitalSignature);28 if(!digitalSignature.equals(sid)) {29 msg = "链接不正确,是否已经过期了?重新申请吧";30 model.addObject("msg",msg) ;31 logInfo(userName,"找回密码链接失效");32 returnmodel;33 }34 model.setViewName("user/reset_password"); //返回到修改密码的界面

35 model.addObject("userName",userName);36 returnmodel;37 }

补充1:Timestamp类型对象在保存到数据的时候 毫秒精度会丢失。比如:2013-10-08 10:29:10.234 存到mysql数据库的时候 变成 2013-10-08 10:29:10.0。时间变得不相同了,sid 匹配的时候不会相等。 所以我做了忽略精度的操作。

补充2:解决linux下面title中文乱码

1 sun.misc.BASE64Encoder enc = newsun.misc.BASE64Encoder();2 mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8", "B")); //解决linux邮件title乱码

补充3:怎么不直接把sid插入到user表呢。验证的时候直接比较sid就ok了。

java实现通过绑定邮箱找回密码功能_SpringMVC通过邮件找回密码功能的实现相关推荐

  1. JAVA实现通过绑定邮箱找回密码功能

    1.输入用户名及验证码,验证用户名是否存在 (1).生成验证码工具类 package com.utils; import java.awt.Color; import java.awt.Font; i ...

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

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

  3. 微信改密码qq邮箱服务器繁忙,微信无法通过邮件修改密码,解决方法

    现在各种智能手机已经成为我们生活中不可或缺的电子产品,现在手机几乎可以满足人们所有的需求,包括娱乐和各种工作需求都可以满足. 微信无法通过邮件修改密码,解决方法 1. 特别是随着各种移动支付平台的出现 ...

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

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

  5. Java实现邮件找回密码功能

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

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

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

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

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

  8. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...

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

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

最新文章

  1. 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
  2. Vm-Tools 安装指南
  3. golang 文件操作 创建 读写 复制移动 权限 删除
  4. MYSQL技术连环斩-MYSQL简述
  5. vi中如何实现批量替换
  6. 织梦DEDE网站后台如何上传附件
  7. 一,数据库基础,MySQL安装,配置文件,语法
  8. 周三直播预告丨openGauss和MogDB的优化分享
  9. 阿里云面向制造业推出防疫复工数字化方案 复工效率提升50%以上
  10. p6 软件 服务器没有项目了,前后端分离项目一台服务器上线
  11. 设计模式学习笔记(5) - 策略模式
  12. 不挖坑比努力填坑更值得
  13. python实现城市到省份的转换
  14. 彩虹的七种颜色CMYK和RGB的值是什么
  15. Oracle设置自增序列
  16. php 数据透视表,无法打开数据透视表源文件怎么解决
  17. linux防恶意软件防病毒 防护工具
  18. SUPPA 可变剪切分析
  19. Endnote: 如何区分中英文期刊
  20. UVALive - 2911 Maximum

热门文章

  1. 教改论文 计算机,容易写的计算机教改论文题目 计算机教改专业论文题目如何拟...
  2. Arm Mbed OS 更适合大学实训平台
  3. 深入理解JVM虚拟机读书笔记【第十二章】Java内存模型与线程
  4. 怎样买到最便宜的机票
  5. 修改Linux系统的主机名
  6. git 本地回退至某个版本
  7. Jdk8内存参数解析与修改(新的参数)
  8. js深度冻结一个对象
  9. Adreno Profiler 分析任意安卓游戏特效、抓取资源
  10. ios 实时全景拼图