java实现通过绑定邮箱找回密码功能

 更新时间:2019年02月10日 10:35:12   作者:亲昵YY   我要评论

这篇文章主要为大家详细介绍了java实现通过绑定邮箱找回密码功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现通过绑定邮箱找回密码功能,供大家参考,具体内容如下

1.输入用户名及验证码,验证用户名是否存在

(1).生成验证码工具类

package com.utils;
 
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
 
/** 
 * @Title: GraphicsUtil.java
 * @copyright 
 * @Package com.utils
 * @Description: TODO(这里用一句话描述这个类的作用)
 * @author Mr.chen
 * @date 2016-11-2 下午03:31:30
 */
public class GraphicsUtil {
 
 private Font mFont = new Font("Times New Roman", Font.PLAIN, 17); 
 
 Color getRandColor(int fc,int bc){
 Random random = new Random(); 
 if(fc>255) fc=255; 
 if(bc>255) bc=255; 
 int r=fc+random.nextInt(bc-fc); 
 int g=fc+random.nextInt(bc-fc); 
 int b=fc+random.nextInt(bc-fc); 
 return new Color(r,g,b);
 }
 
 public Map<String, Object> getGraphics(){
 
 int width=100,height=18;
 BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
 Graphics g=image.getGraphics();
 Random random = new Random(); 
 g.setColor(getRandColor(200,250)); 
 g.fillRect(1, 1, width-1, height-1); 
 g.setColor(new Color(102,102,102)); 
 g.drawRect(0, 0, width-1, height-1); 
 g.setFont(mFont); 
 g.setColor(getRandColor(160,200)); 
 //画随机线 
 for (int i=0;i<155;i++){ 
 int x = random.nextInt(width - 1); 
 int y = random.nextInt(height - 1); 
 int xl = random.nextInt(6) + 1; 
 int yl = random.nextInt(12) + 1; 
 g.drawLine(x,y,x + xl,y + yl); 
 } 
 
 //从另一方向画随机线 
 for (int i = 0;i < 70;i++){ 
 int x = random.nextInt(width - 1); 
 int y = random.nextInt(height - 1); 
 int xl = random.nextInt(12) + 1; 
 int yl = random.nextInt(6) + 1; 
 g.drawLine(x,y,x - xl,y - yl); 
 } 
 
 //生成随机数,并将随机数字转换为字母 
 String sRand=""; 
 for (int i=0;i<6;i++){ 
 int itmp = random.nextInt(26) + 65; 
 char ctmp = (char)itmp; 
 sRand += String.valueOf(ctmp); 
 g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 
 g.drawString(String.valueOf(ctmp),15*i+10,16); 
 } 
 
 g.dispose();
 
 Map<String, Object> map=new HashMap<String, Object>();
 map.put("rand", sRand);
 map.put("image", image);
 return map;
 }
 
}

(2).生成验证码action

/**
 * @Description: 获取验证码 
 * @author Mr.chen
 * @date 2016-11-2 下午03:45:28
 */
 public void getCode(){
 try {
 HttpServletResponse response = ServletActionContext.getResponse();
 
 HttpServletRequest request= ServletActionContext.getRequest();
 
 response.setHeader("Pragma","No-cache"); 
 response.setHeader("Cache-Control","no-cache"); 
 response.setDateHeader("Expires", 0); 
 //表明生成的响应是图片 
 response.setContentType("image/jpeg");
 
 Map<String, Object> map=new GraphicsUtil().getGraphics();
 System.out.println(map.get("rand"));
 request.getSession().setAttribute("rand", map.get("rand"));
 ImageIO.write((RenderedImage) map.get("image"), "JPEG", response.getOutputStream());
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
(3).验证用户名是否存在
 /**
 * @Description: 检查用户名是否存在
 * @author Mr.chen
 * @date 2016-11-2 下午04:49:02
 */
 public void checkUsernumber(){
 try {
 HttpServletResponse response = ServletActionContext.getResponse();
 
 HttpServletRequest request= ServletActionContext.getRequest();
 String usernumber = request.getParameter("usernumber");
 Studentinfo stu= studentinfoService.getStudentinfoByUsernumber(usernumber);
 response.setContentType("text/plain; charset=utf-8");
 response.setCharacterEncoding("UTF-8");
 if(stu==null){
 response.getWriter().print("false");
 
 }else{
 if(!StringUtils.isBlank(stu.getEmail())){
 response.getWriter().print("true");
 }else{
 response.getWriter().print("notEmail");
 }
 
 }
 response.getWriter().flush();
 response.getWriter().close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

2.用户名验证通过后往绑定邮箱发送邮件

/**
 * @Description: 发送邮件
 * @author Mr.chen
 * @date 2016-11-2 下午05:06:24
 */
 @SuppressWarnings("static-access")
 public String toFindPassword2(){
 HttpServletRequest request= ServletActionContext.getRequest();
 String usernumber = request.getParameter("usernumber");
 Studentinfo stu= studentinfoService.getStudentinfoByUsernumber(usernumber);
 try {
 Properties prop = new Properties();
 prop.setProperty("mail.transport.protocol", "smtp");
 prop.setProperty("mail.smtp.host", "smtp.qq.com");
 prop.setProperty("mail.smtp.auth", "true");
 prop.put("mail.smtp.port","587");
 prop.setProperty("mail.debug", "true");
 //验证写信者邮箱,此处使用第三方授权码登陆,使用密码不知道为什么登录不上
 Authenticator authenticator = new PopAuthenticator("123456789@qq.com", "**************");
 //创建会话
 Session session = Session.getInstance(prop,authenticator);
 //填写信封写信
 Message msg = new MimeMessage(session);
 //设置发邮件的原地址
 msg.setFrom(new InternetAddress("123456789@qq.com"));
 //设置接收人
 msg.setRecipient(RecipientType.TO, new InternetAddress(stu.getEmail()));
 msg.setSubject("找回密码!");
 msg.setText(this.createLink(stu));
 //验证用户名密码发送邮件
 Transport transport = session.getTransport();
 transport.send(msg);
 request.setAttribute("stu", stu); 
 return SUCCESS;
 
 }catch(Exception e){
 e.printStackTrace();
 }
 return ERROR;
 }
/**
 * @Description: 生成邮箱链接地址
 * @author Mr.chen
 * @date 2016-11-3 下午01:50:14
 */
 public String createLink(Studentinfo stu){
 
 //生成密钥
 String secretKey=UUID.randomUUID().toString();
 //设置过期时间
 Date outDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期
 System.out.println(System.currentTimeMillis());
 long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数 mySql 取出时间是忽略毫秒数的
 
 //此处应该更新Studentinfo表中的过期时间、密钥信息
 stu.setOutDate(date);
 stu.setValidataCode(secretKey);
 studentinfoService.updateStudentinfo(stu);
 //将用户名、过期时间、密钥生成链接密钥
 String key =stu.getUsernumber() + "$" + date + "$" + secretKey;
 
 String digitalSignature = MD5Util.getMd5(key);// 数字签名
 
 HttpServletRequest request= ServletActionContext.getRequest();
 
 String path=request.getContextPath();
 
 String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
 
 String resetPassHref = basePath + "/toFindPassword3.action?sid="+ digitalSignature +"&id="+stu.getId();
 
 String emailContent = "请勿回复本邮件.点击下面的链接,重设密码,本邮件超过30分钟,链接将会失效,需要重新申请找回密码." + resetPassHref;
 
 return emailContent;
 }

3.邮件发送成功后进入邮箱,通过该链接进入修改密码请求,链接验证通过后进入修改密码页面

/**
 * @Description: 该方法用于处理从邮箱链接过来的修改密码请求
 * @author Mr.chen
 * @date 2016-11-3 下午02:24:17
 */
 public String toFindPassword3(){
 String message="";
 HttpServletRequest request= ServletActionContext.getRequest();
 //获取链接中的加密字符串
 String sid=request.getParameter("sid");
 //获取链接中的用户名
 String id=request.getParameter("id");
 if(StringUtils.isBlank(sid)||StringUtils.isBlank(id)){
 System.out.println("请求的链接不正确,请重新操作.");
 message="请求的链接不正确,请重新操作.";
 }
 Studentinfo stu=studentinfoService.getStudentinfoById(Long.parseLong(id));
 
 if(stu!=null){
 //获取当前用户申请找回密码的过期时间
 //找回密码链接已经过期
 if(stu.getOutDate()<=System.currentTimeMillis()){
 System.out.println("链接已经过期");
 message="链接已经过期";
 }
 //获取当前登陆人的加密码
 String key = stu.getUsernumber()+"$"+stu.getOutDate()/1000*1000+"$"+stu.getValidataCode();//数字签名
 
 String digitalSignature = MD5Util.getMd5(key);// 数字签名
 
 if(!digitalSignature.equals(sid)){
 System.out.println("链接加密密码不正确");
 message="链接加密密码不正确";
 }else{
 //验证成功,跳入到修改密码界面
 request.setAttribute("stu", stu);
 }
 
 }else{
 System.out.println("用户信息不存在");
 message="用户信息不存在";
 request.setAttribute("message", message);
 }
 return SUCCESS;
 }

4.输入新密码,验证成功后即修改成功

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java集合类知识点总结

    Java集合类知识点总结

    本文把Java集合类的相关知识点做了总结,并把Java常用集合类之间的区别做了分析,一起参考学习下。
    2018-02-02
  • Spring事务隔离级别简介及实例解析

    Spring事务隔离级别简介及实例解析

    这篇文章主要介绍了Spring事务隔离级别简介及实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 浅谈java中String StringBuffer StringBuilder的区别

    浅谈java中String StringBuffer StringBuilder的区别

    下面小编就为大家带来一篇浅谈java中String StringBuffer StringBuilder的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java编程实现快速排序及优化代码详解

    Java编程实现快速排序及优化代码详解

    这篇文章主要介绍了Java编程实现快速排序及优化代码详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • java仿windows记事本小程序

    java仿windows记事本小程序

    这篇文章主要为大家详细介绍了java仿windows记事本小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 详解Spring Boot 异步执行方法

    详解Spring Boot 异步执行方法

    这篇文章主要介绍了Spring Boot 异步执行方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • zookeeper实现分布式锁

    zookeeper实现分布式锁

    这篇文章主要为大家详细介绍了基于zookeeper实现分布式锁,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • JAVAEE项目结构以及并发随想

    JAVAEE项目结构以及并发随想

    每个代码里面的工具都是工具,API是你最需要理解的,哪个好,哪个不好,没有准确答案。 一切皆对象,对于Java来讲是纯粹的,代理是对象,反射是对象,对象是对象,基本数据类型不是对象。
    2016-04-04
  • 使用spring实现邮件的发送实例(含测试,源码,注释)

    使用spring实现邮件的发送实例(含测试,源码,注释)

    本篇文章主要介绍了使用spring实现邮件的发送实例,详细的介绍了使用spring配置实现邮件发送,含测试,源码,注释,有兴趣的可以下
    2017-05-05
  • Java创建文件且写入内容的方法

    Java创建文件且写入内容的方法

    这篇文章主要介绍了Java创建文件且写入内容的方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07

最新评论