激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|

服務器之家 - 編程語言 - JAVA教程 - Java實現郵箱找回密碼實例代碼

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

2020-06-30 11:22智慧云端日記 JAVA教程

本篇文章主要介紹了Java實現郵箱找回密碼實例代碼,可以通過郵箱找回丟失密碼,具有一定的參考價值,有需要的可以了解一下。

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

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

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

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

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

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

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

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

使用到的數據庫如下 :

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

找回郵箱密碼代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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 [email protected]
 *
 */
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("[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();
    }
    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中文亂碼

?
1
2
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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久九九热re6这里有精品 | 免费观看一区二区三区视频 | 久草在线资源观看 | 亚洲成人在线免费 | 轻点插视频 | 久久久久成人精品免费播放 | 久久久日韩精品一区二区 | 内地av在线| 国产二区三区四区 | 欧美黄色试片 | 日本精品网 | 草久影视 | 7777视频| 九九热免费在线观看 | a网在线| 久久99精品久久久久久国产越南 | a一级黄色大片 | 欧美性生交xxxxx免费观看 | 最新se94se在线欧美 | 精品国产一区二区在线 | 中文字幕亚洲一区二区三区 | 色综合视频网 | 精品av在线播放 | 欧美日韩国产一区二区三区在线观看 | 欧美三级欧美成人高清www | 91av网址| 一区二区三区四区视频在线观看 | 欧美成人一级片 | 国产精品视频一区二区三区四区五区 | 最新国产毛片 | 欧美精品亚洲人成在线观看 | 福利在线小视频 | 把娇妻调教成暴露狂 | 久久久久久艹 | 九九精品在线观看 | 中文字幕在线观看1 | 暖暖免费观看高清完整版电影 | 国产亚色 | 国产一区二区三区在线观看视频 | 91嫩草丨国产丨精品入口 | 欧美一区二区三区四区电影 |