Java实现邮箱找回密码 --转载

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

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

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

重点就是如何生成这个url和如何解析这个url. 
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱

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

数字签名 = MD5(用户名+‘

′ +过期时间+‘

’+密钥key) 
数据库字段(用户名(主键),密钥key,过期时间) 
url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,

url example:http://www.wechat68.com:80/CardSSHOK/checkLink?sid=K3xHOi4o/UihH5QYWBDfYA==&userName=123

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

使用到的数据库如下 

package com.soq.card.web.action;

import java.sql.Timestamp;
import java.util.List;
import java.util.UUID;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.soq.card.biz.UserHander;
import com.soq.card.entity.Users;
import com.soq.card.tools.DBhepler;
import com.soq.card.tools.Mail;
import com.soq.card.tools.Md5;
import com.soq.card.web.base.BaseAction;

publicclass PassEmailAction extends BaseAction {
    private Users users;
    private UserHander userHander;

    private String email;
    private String sid;
    private String userName;

    public String sendmail() {
        try {
            HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate();
            SessionFactory factory = ht.getSessionFactory();
            Session session = factory.openSession();
            Criteria criteria = session.createCriteria(Users.class);
            criteria.add(Restrictions.eq("loginName", email));
            List<Users> list = criteria.list();
            if (list.size() > 0) {
                users=list.get(0);
                Mail mail = new Mail();

                String secretKey = UUID.randomUUID().toString(); // 密钥
                Timestamp outDate = new Timestamp(System.currentTimeMillis() + 30 * 60 * 1000);// 30分钟后过期long date = outDate.getTime() / 1000 * 1000;// 忽略毫秒数  mySql 取出时间是忽略毫秒数的

                DBhepler bhepler=new DBhepler();
                String sql="update users set outDate=?,validataCode=? where loginName=?;";
                String str[] ={outDate+"",secretKey,users.getLoginName()};
                bhepler.AddU(sql, str);

                //this.getUserHander().getUsersDAO().getHibernateTemplate().update(users); // 保存到数据库
                System.out.println("   UserName>>>> "+users.getUserName());
                String key =users.getUserName() + "$" + date + "$" + secretKey;
                System.out.println(" key>>>"+key);
                String digitalSignature = Md5.md5(key);// 数字签名

                String path = this.getRequest().getContextPath();
                String basePath = this.getRequest().getScheme() + "://"
                        + this.getRequest().getServerName() + ":"
                        + this.getRequest().getServerPort() + path + "/";
                String resetPassHref = basePath + "checkLink?sid="
                        + digitalSignature +"&userName="+users.getUserName();
                String emailContent = "请勿回复本邮件.点击下面的链接,重设密码<br/><a href="
                        + resetPassHref + " target=‘_BLANK‘>" + resetPassHref
                        + "</a>  或者    <a href=" + resetPassHref
                        + " target=‘_BLANK‘>点击我重新设置密码</a>"
                        + "<br/>tips:本邮件超过30分钟,链接将会失效,需要重新申请‘找回密码‘" + key
                        + "\t" + digitalSignature;

                mail.setTo(email);
                mail.setFrom("XX");// 你的邮箱
                mail.setHost("smtp.163.com");
                mail.setUsername("[email protected]");// 用户
                mail.setPassword("CXXX");// 密码
                mail.setSubject("[二维码名片]找回您的账户密码");
                mail.setContent(emailContent);
                if (mail.sendMail()) {
                    System.out.println(" 发送成功");
                    this.getRequest().setAttribute("mesg", "重置密码邮件已经发送,请登陆邮箱进行重置!");
                    return "sendMail";
                }
            } else {
                this.getRequest().setAttribute("mesg", "用户名不存在,你不会忘记邮箱了吧?");
                return "noUser";
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        returnnull;
    }

    public String checkResetLink() {
        System.out.println("sid>>>" + sid);

        if (sid.equals("")  || userName.equals("")) {
            this.getRequest().setAttribute("mesg", "链接不完整,请重新生成");
            System.out.println(">>>>> null");
            return "error";
        }
        HibernateTemplate ht = this.getUserHander().getUsersDAO().getHibernateTemplate();
        SessionFactory factory = ht.getSessionFactory();
        Session session = factory.openSession();
        Criteria criteria = session.createCriteria(Users.class);
        criteria.add(Restrictions.eq("userName", userName));
        List<Users> list = criteria.list();
        if (list.size()>0) {
            users=list.get(0);

            Timestamp outDate = (Timestamp) users.getOutDate();
            System.out.println("outDate>>>"+outDate);
             if(outDate.getTime() <= System.currentTimeMillis()){ //表示已经过期this.getRequest().setAttribute("mesg", "链接已经过期,请重新申请找回密码.");
                 System.out.println("时间 超时");
                 return "error";
             }

             String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();//数字签名

             System.out.println("key link》》"+key);
             String digitalSignature = Md5.md5(key);// 数字签名

             System.out.println("digitalSignature>>>>"+digitalSignature);
              if(!digitalSignature.equals(sid)) {
                  this.getRequest().setAttribute("mesg", "链接不正确,是否已经过期了?重新申请吧.");
                      System.out.println("标示不正确");
                    return "error";
              }else {
                //链接验证通过 转到修改密码页面this.getRequest().setAttribute("user", users);
                return "success";
            }
        }else {
            this.getRequest().setAttribute("mesg", "链接错误,无法找到匹配用户,请重新申请找回密码.");
            System.out.println("用户不存在");
            return "error";
        }
    }

    public Users getUsers() {
        return users;
    }

    publicvoid setUsers(Users users) {
        this.users = users;
    }

    public UserHander getUserHander() {
        return userHander;
    }

    publicvoid setUserHander(UserHander userHander) {
        this.userHander = userHander;
    }

    public String getEmail() {
        return email;
    }

    publicvoid setEmail(String email) {
        this.email = email;
    }

    public String getSid() {
        return sid;
    }

    publicvoid setSid(String sid) {
        this.sid = sid;
    }

    public String getUserName() {
        return userName;
    }

    publicvoid setUserName(String userName) {
        this.userName = userName;
    }

}

时间: 2024-10-07 11:08:02

Java实现邮箱找回密码 --转载的相关文章

Java实现邮箱找回密码

[来源网络:http://www.cnblogs.com/zyw-205520/p/3738439.html] 通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url.

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

AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . AspNetCore - MVC实战系列(一)之Sqlserver表映射实体模型 . AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码 开篇唠嗑 本篇内容写在5.1假期前夕,主要是让大家能在节假日休息充点的时候能有好的干货例子,到目前为止netcore方面的实战例子分享即将进入正轨,谢谢各位朋友多多支持:最近工作安排的新项目即将开始,项目前期就我一人搭建,让我犹豫的是对于公司这个内部系统并且是初建的项目用什么开

php通过邮箱找回密码

很久没有写过博客了,现在我要重新开始记录,工作中遇到的一些问题,并将其记录下来最为经验的积累. --------------------回归正题----------------------- 很多网站,只要有用户注册,就必然会遇到用户登陆时忘记密码的情况,常用的找回密码的方式有两种,一种是通过发送短信验证码,另一种是通过发送连接到邮箱,打开连接通过验证后跳转到重置密码界面. 短信认证的方法,之前写过一篇jsp版本的.通过短信找回密码. 思路十分简单,通过随机生成6位字符验证码,然后将其写入数据库

给自己项目添加注册、登陆、改密码、邮箱找回密码等功能,出现大坑!

1.使用django验证框架的登陆.注销功能,必须settings设置如下: LOGIN_REDIRECT_URL = 'shop:product_list' LOGOUT_REDIRECT_URL = 'shop:product_list' LOGIN_URL = 'shop:login' LOGOUT_URL = 'shop:logout' LOGIN_REDIRECT_URL = 'shop:product_list'-----------登录成功后,转到哪个页面的url,在此设置. LO

简述邮箱找回密码功能

1. 在登录页面给个链接,在找回密码界面可以输入邮箱地址和验证码,验证码是为了防止恶意找回: 2. 后台,首先判断验证码是否正确,再判断该邮箱是否注册过用户; 3. 如果该邮箱存在,检索出该用户信息; 4. 如果你的密码没有MD5加密的话,可以直接查询出密码,如果MD5加密了,只能重新生成一个密码,并修改该用户: 5. 将新生成的密码发送到用户邮箱里,用JavaMail发送邮件;

[py][mx]django通过邮箱找回密码

忘记密码处理流程 直接上代码 class ActiveView(View): # 主要功能是修改user_profile里的is_active字段为1 def get(self, request, active_code): all_reocrds = EmailVerifyRecord.objects.filter(code=active_code) if all_reocrds: for record in all_reocrds: email = record.email user = U

thinkphp_邮箱找回密码

QQ邮箱STMP配置 链接... thinkphp mailer类加载  链接-- 看了上面两步你就可以做邮箱接口啦

django 开发忘记密码通过邮箱找回功能

一.流程分析: 1.点击忘记密码====>forget.html页面,输入邮箱和验证码,发送验证链接网址的邮件====>发送成功,跳到send_success.html提示 2.到邮箱里找到验证链接网址,访问重设密码网址reset.html===>重设密码提交数据,成功则返回首页,失败则返回错误信息 二. 1.users/forms.py文件中 from django import forms from captcha.fields import CaptchaField .......

Jsp邮件找回密码全攻略

[来源网络  http://www.2cto.com/kf/201502/376374.html] 一般大型网站我们登录的时候,密码忘了都有个功能可以找回密码. 细数下大致的方法: 1.直接把密码发送到你的邮箱去.一般是临时密码. 2.短信验证,成本较高. 3.密保问题 4.发送一个链接到你邮箱点击即可更改密码. 个人认为第四种方法最经济实惠,这次也主要都是在搞这个. 搞了一个晚上,单单邮件发送功能写了快300行,虽然很多是注释和空格,被舍友一说,用python只写了20几行,不禁膜拜PYTHO