欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)郵箱找回密碼實例代碼

 更新時間:2016年11月04日 11:06:46   作者:智慧云端日記  
本篇文章主要介紹了Java實現(xiàn)郵箱找回密碼實例代碼,可以通過郵箱找回丟失密碼,具有一定的參考價值,有需要的可以了解一下。

通過郵件找回密碼功能的實現(xiàn)
1、最近開發(fā)一個系統(tǒng),有個需求就是,忘記密碼后通過郵箱找回?,F(xiàn)在的系統(tǒng)在注冊的時候都會強制輸入郵箱,其一目的就是 通過郵件綁定找回,可以進行密碼找回。通過java發(fā)送郵件的功能我就不說了,重點講找回密碼。

2、參考別人的思路:發(fā)送郵件→請求郵件里的URL→驗證url→{驗證成功修改密碼,不成功跳轉(zhuǎn)到失敗頁面}

重點就是如何生成這個url和如何解析這個url.
需要注意的是一個url只能修改一次密碼,當同一帳號發(fā)送多封郵件,只有最后一封郵件的url 郵箱

 3、加密能防止偽造攻擊,一次url只能驗證一次,并且綁定了用戶。生成url:   可以用UUID生成隨機密鑰。

數(shù)字簽名 = MD5(用戶名+'′+過期時間+‘′+過期時間+‘'+密鑰key)

數(shù)據(jù)庫字段(用戶名(主鍵),密鑰key,過期時間)

url參數(shù)(用戶名,數(shù)字簽名) ,密鑰key的生成:在每一個用戶找回密碼時候為這個用戶生成一個密鑰key ,

生成過期時間,生成數(shù)字簽名,生成url,發(fā)送郵件.   AddU(用戶名,密鑰key,過期時間)

使用到的數(shù)據(jù)庫如下 :

找回郵箱密碼代碼如下:

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;

/**
 * @author javen
 * @Email zyw205@gmail.com
 * 
 */
public class 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;// 忽略毫秒數(shù) mySql 取出時間是忽略毫秒數(shù)的
        
        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); // 保存到數(shù)據(jù)庫
        System.out.println("  UserName>>>> "+users.getUserName());
        String key =users.getUserName() + "$" + date + "$" + secretKey;
        System.out.println(" key>>>"+key);
        String digitalSignature = Md5.md5(key);// 數(shù)字簽名

        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 = "請勿回復本郵件.點擊下面的鏈接,重設(shè)密碼<br/><a href="
            + resetPassHref + " target='_BLANK'>" + resetPassHref
            + "</a> 或者  <a href=" + resetPassHref
            + " target='_BLANK'>點擊我重新設(shè)置密碼</a>"
            + "<br/>tips:本郵件超過30分鐘,鏈接將會失效,需要重新申請'找回密碼'" + key
            + "\t" + digitalSignature;

        mail.setTo(email);
        mail.setFrom("XX");// 你的郵箱
        mail.setHost("smtp.163.com");
        mail.setUsername("XXX@163.com");// 用戶
        mail.setPassword("CXXX");// 密碼
        mail.setSubject("[二維碼名片]找回您的賬戶密碼");
        mail.setContent(emailContent);
        if (mail.sendMail()) {
          System.out.println(" 發(fā)送成功");
          this.getRequest().setAttribute("mesg", "重置密碼郵件已經(jīng)發(fā)送,請登陸郵箱進行重置!");
          return "sendMail";
        }
      } else {
        this.getRequest().setAttribute("mesg", "用戶名不存在,你不會忘記郵箱了吧?");
        return "noUser";
      }
    } catch (Exception e) {
      // TODO: handle exception 
      e.printStackTrace();
    }
    return null;
  }

  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()){ //表示已經(jīng)過期
         this.getRequest().setAttribute("mesg", "鏈接已經(jīng)過期,請重新申請找回密碼.");
         System.out.println("時間 超時");
         return "error";
       }
       
       String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();//數(shù)字簽名
      
       System.out.println("key link》》"+key);
       String digitalSignature = Md5.md5(key);// 數(shù)字簽名
       
       System.out.println("digitalSignature>>>>"+digitalSignature);
       if(!digitalSignature.equals(sid)) {
         this.getRequest().setAttribute("mesg", "鏈接不正確,是否已經(jīng)過期了?重新申請吧.");
           System.out.println("標示不正確");
          return "error";
       }else {
        //鏈接驗證通過 轉(zhuǎn)到修改密碼頁面
        this.getRequest().setAttribute("user", users);
        return "success";
      }
    }else {
      this.getRequest().setAttribute("mesg", "鏈接錯誤,無法找到匹配用戶,請重新申請找回密碼.");
      System.out.println("用戶不存在");
      return "error";
    }
  }

  public Users getUsers() {
    return users;
  }

  public void setUsers(Users users) {
    this.users = users;
  }

  public UserHander getUserHander() {
    return userHander;
  }

  public void setUserHander(UserHander userHander) {
    this.userHander = userHander;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getSid() {
    return sid;
  }

  public void setSid(String sid) {
    this.sid = sid;
  }

  public String getUserName() {
    return userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

}

補充1:Timestamp類型對象在保存到數(shù)據(jù)的時候 毫秒精度會丟失。比如:2014-05-20 10:30:10.234  存到mysql數(shù)據(jù)庫的時候 變成 2013-05-20 10:30:10.0。時間變得不相同了,sid 匹配的時候不會相等。 所以我做了忽略精度的操作。

補充2:解決linux下面title中文亂碼

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8", "B"));   //解決linux郵件title亂碼

補充3:怎么不直接把sid插入到users表呢。驗證的時候直接比較sid就ok了。

源碼下載地址:http://pan.baidu.com/s/1cl8hKq

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Java SSM的健康管理小程序的實現(xiàn)

    基于Java SSM的健康管理小程序的實現(xiàn)

    本篇文章主要為大家分享了基于SSM健康管理小程序的設(shè)計與實現(xiàn)。感興趣的小伙伴可以了解一下
    2021-11-11
  • 談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡單實現(xiàn)(小結(jié))

    談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡單實現(xiàn)(小結(jié))

    這篇文章主要介紹了談?wù)凷pring Boot 數(shù)據(jù)源加載及其多數(shù)據(jù)源簡單實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java讀取properties文件內(nèi)容的幾種方式詳解

    Java讀取properties文件內(nèi)容的幾種方式詳解

    這篇文章主要介紹了Java讀取properties文件內(nèi)容的幾種方式詳解,讀取properties配置文件在實際的開發(fā)中使用的很多,本文來介紹常用的幾種實現(xiàn)方式,需要的朋友可以參考下
    2023-11-11
  • 淺析Java中接口和抽象類的七大區(qū)別

    淺析Java中接口和抽象類的七大區(qū)別

    Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實現(xiàn)。本文也將為大家詳細講一下二者的區(qū)別,需要的可以參考一下
    2021-12-12
  • springboot集成mybatisPlus+多數(shù)據(jù)源的實現(xiàn)示例

    springboot集成mybatisPlus+多數(shù)據(jù)源的實現(xiàn)示例

    這篇文章主要介紹了springboot集成mybatisPlus+多數(shù)據(jù)源的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringMvc接受請求參數(shù)的幾種情況演示

    SpringMvc接受請求參數(shù)的幾種情況演示

    Springmvc接受請求參數(shù)的幾種介紹,如何接受json請求參數(shù),本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • java8中Stream的使用以及分割list案例

    java8中Stream的使用以及分割list案例

    這篇文章主要介紹了java8中Stream的使用以及分割list案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java對象以Hash結(jié)構(gòu)存入Redis詳解

    Java對象以Hash結(jié)構(gòu)存入Redis詳解

    這篇文章主要介紹了Java對象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對象非常相似,卻不能按照Java對象的結(jié)構(gòu)直接存儲進Redis的hash中,因為Java對象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下
    2023-08-08
  • Java經(jīng)典快排思想以及快排的改進講解

    Java經(jīng)典快排思想以及快排的改進講解

    今天小編就為大家分享一篇關(guān)于Java經(jīng)典快排思想以及快排的改進講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java整合onlyoffice的各種踩坑記錄

    java整合onlyoffice的各種踩坑記錄

    這篇文章主要給大家介紹了關(guān)于java整合onlyoffice的各種踩坑,OnlyOffice是一種強大的在線協(xié)作軟件,專為企業(yè)和個人設(shè)計,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07

最新評論