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

19 篇文章 0 订阅
12 篇文章 0 订阅

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 下午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.输入新密码,验证成功后即修改成功




原文

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值