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

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

(0)

相关推荐

  • Java实现邮箱找回密码实例代码

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱 3.加密能防止

  • JavaWeb利用邮箱帮用户找回密码

    本文是介绍在一个小的JAVAWeb项目中,利用邮箱帮用户找回密码. 效果展示    需要一个发送邮件的jar包 : javax.mail .jar 1.JSP页面(设置邮箱输入框) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="

  • java web实现邮箱激活与忘记密码

    由于在项目中要实现用户注册的邮箱激活以及忘记密码重置密码功能,所以通过查阅资料做了一个简单的设计和实现. 邮箱激活 背景:几乎每个网站或论坛之类的用户注册后都需要通过发送邮件到邮箱激活用户. 设计: 激活步骤: 1. 发送激活操作链接地址至用户邮箱. 2. 用户至邮箱查收邮件. 3. 用户点击链接,跳转至成功页面(修改激活状态),激活成功. 实现: /** * 发送邮件 * * @param request * @return */ @RequestMapping(value = "/sendE

  • java web激活邮箱并找回密码

    几乎每个网站或论坛之类的用户注册后都需要通过发送邮件到邮箱激活用户,如何激活邮箱呐? 设计激活步骤: 1.发送激活操作链接地址至用户邮箱. 2.用户至邮箱查收邮件. 3.用户点击链接,跳转至成功页面(修改激活状态),激活成功. 实现: /** * 发送邮件 * * @param request * @return */ @RequestMapping(value = "/sendEmail.jhtml") @ResponseBody public String sendEmail(Ht

  • JavaEE账号注册模拟网站邮箱激活

    本项目是javaWeb和email结合的项目,模拟网站必须要激活邮箱账号才可以使用, 创建数据库 create table user( id varchar(32) primary key, name varchar(30), pwd varchar(20), email varchar(20), active char(1), acode varchar(32) ) User.java值对象 package cn.hncu.reg.domain; import javax.persistenc

  • Java注册邮箱激活验证实现代码

    最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用 RegisterValidateService.java 复制代码 代码如下: package com.app.service.impl; import java.text.ParseException;import java.util.Date; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stere

  • Java随机密码生成并和邮箱、手机号匹配

    废话不多说了,直接给大家贴java代码了,代码有所注释,写的不好,还请各位大家多多关照. 代码如下所示: package com.alibaba.uyuni.common.util; import java.util.Random; public class GeneratePassword { /** * 生成随机密码 * @param pwd_len * 生成的密码的总长度 * @return 密码的字符串 */ public static String genRandomNum(int p

  • Java实现注册邮箱激活账户实例代码

    在网站注册时一般都会要验证注册用户身份的合法性,通常的做法是提供手机号验证或者邮箱验证. 手机验证:填写手机号码,点击发送验证码,接收后填写验证码比对,无误后注册成功. 邮箱验证:注册时填写邮箱账号,点击注册,网站邮箱会给该邮箱发送一封激活邮件,用户点击后激活该账号. 这里通过实例来介绍一下邮箱验证的实现过程,例子可以运行,暂时没有发现什么问题,不过也可能有不安全的地方,欢迎大家指正. 实现思路 注册时填写邮箱,点击注册时网站系统邮箱发送激活验证链接到此邮箱,用户来激活账户 点击注册,系统邮箱会

  • 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

  • Asp.NEt邮箱验证修改密码通过邮箱找回密码功能

    使用邮箱验证修改密码,在这里我是使用163免费邮进行测试 前台代码 <input type="text" name="Mail" id="Mail"/> <span>*请输入邮箱</span><br/> <asp:Button ID="zhuce" runat="server" Text="tijiao" OnClick="

  • java springboot邮箱找回密码功能的实现讲解

    目录 一.主要内容 二.邮箱找回密码的思想 三.前台页面 四.注意事项 五.部分实现代码 5.1 页面代码 5.2 发送验证码到注册邮箱的代码 5.3 修改密码 总结 一.主要内容 基于springboot实现密码找回功能. 二.邮箱找回密码的思想 1.输入注册邮箱,点击获取验证码.会将验证码发送到邮箱. 2.用户进入邮箱,查看验证码. 3.用户输入验证码,输入新密码,点击修改密码,完成修改. 三.前台页面 四.注意事项 如果是163或者qq邮箱需要打开授权,以163为例: 如果是阿里的企业邮箱

  • Java实现邮件找回密码功能

    本文实例为大家分享了Java实现邮件找回密码功能的具体代码,供大家参考,具体内容如下 1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最

  • PHP会员找回密码功能的简单实现

    设置思路 1.用户注册时需要提供一个E-MAIL邮箱,目的就是用该邮箱找回密码. 2.当用户忘记密码或用户名时,点击登录页面的"找回密码"超链接,打开表单,并输入注册用的E-MAIL邮箱,提交. 3.系统通过该邮箱,从数据库中查找到该用户信息,并更新该用户的密码为一个临时密码(比如:12345678). 4.系统借助Jmail功能把该用户的信息发送到该用户的邮箱中(内容包括:用户名.临时密码.提醒用户及时修改临时密码的提示语). 5.用户用临时密码即可登录. HTML 我们在找回密码的

  • Django实现发送邮件找回密码功能

    在各大网站上,一定都遇到过找回密码的问题,通常采用的方式是通过发送带有验证码的邮件进行身份验证,本文将介绍通过Django实现邮件找回密码功能. 找回密码流程 功能流程: 1.首先在用户登录界面,添加"忘记密码"链接 2.生成随机验证码,发送邮件到用户信息中填写邮箱 3.在重置密码页面,验证填写验证码是否需匹配 4.重置密码成功,重新进入到登录页面 技术点: 1.发送邮件使用Django内置的django.core.mail实现 2.重置密码页面验证验证码填写是否匹配,提前将发送的验证

  • Python实现在线暴力破解邮箱账号密码功能示例【测试可用】

    本文实例讲述了Python实现在线暴力破解邮箱账号密码功能.分享给大家供大家参考,具体如下: dic 字典格式如下(mail.txt) : username@gmail.com:password username@gmail.com:password username@gmail.com:password 以此类推,切记保存成utf-8编码格式. 放置在当前脚本目录,也可自己定义修改. 支持ssl https /imap协议. # version 3.4.0 # coding='UTF-8' #

  • SpringMVC实现通过邮件找回密码功能

    最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户

  • thinkphp框架下实现登录、注册、找回密码功能

    本文实例为大家分享了thinkphp框架下使用ajax表单提交的登录.注册.找密码的实现方法,以及注册后的用户需后台审核. user表的字段为id.num.password.name.email.addtime.status 具体代码如下 <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller { //处理登录 public function signin(){

随机推荐