国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java實現郵箱找回密碼實例代碼

2019-11-26 13:37:11
字體:
來源:轉載
供稿:網友

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

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

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

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

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

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

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

生成過期時間,生成數字簽名,生成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;/** * @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;// 忽略毫秒數 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("XXX@163.com");// 用戶        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();    }    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()){ //表示已經過期         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;  }  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類型對象在保存到數據的時候 毫秒精度會丟失。比如:2014-05-20 10:30:10.234  存到mysql數據庫的時候 變成 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芜湖县| 黑水县| 驻马店市| 罗山县| 溆浦县| 澄城县| 县级市| 大邑县| 海淀区| 渭南市| 四平市| 桐乡市| 青州市| 大悟县| 余江县| 克东县| 尤溪县| 东宁县| 屏山县| 乐清市| 新宾| 富源县| 宿州市| 神木县| 呼伦贝尔市| 金秀| 阿克陶县| 获嘉县| 田林县| 通榆县| 克什克腾旗| 高要市| 深圳市| 龙川县| 平山县| 临武县| 晴隆县| 家居| 铁力市| 积石山| 腾冲县|