Реализация функции восстановления пароля по электронной почте
1. Недавно я разработал систему, и у меня есть требование, чтобы получить ее по электронной почте после того, как забыл свой пароль. В настоящее время система заставит электронное письмо ввести адрес электронной почты при регистрации. Одна из целей - извлечь его через привязку по электронной почте, и вы можете получить пароль. Я не буду говорить о функции отправки электронных писем через Java, но сосредоточиться на получении паролей.
2. См. Идеи других людей: Отправить электронное письмо → запрос URL -адрес по электронной почте → проверка URL → {проверьте успешно изменение пароля, но перейдите на неудачу, если она не удастся}
Дело в том, как генерировать этот URL и как проанализировать этот URL.
Следует отметить, что URL может изменить пароль только один раз. Когда в одной учетной записи отправляются несколько электронных писем, существует только адрес электронной почты URL последнего электронного письма.
3. шифрование может предотвратить подделки. URL может быть проверен только один раз и связывает пользователя. Создание URL: вы можете использовать UUID для генерации случайного ключа.
Digital Signature = MD5 (имя пользователя +'' +время истечения срока действия +'' +время истечения срока действия +'' +клавиша ключа)
Поле базы данных (имя пользователя (первичная клавиша), ключ, время истечения)
параметры URL (имя пользователя, цифровая подпись), генерация ключей: генерируйте ключ для каждого пользователя при получении пароля,
Создайте время истечения, генерируйте цифровую подпись, генерируйте URL и отправляйте электронные письма. Addu (имя пользователя, ключ, время истечения)
Используемая база данных выглядит следующим образом:
Пароль для получения адреса электронной почты выглядит следующим образом:
пакет com.soq.card.web.action; импорт java.sql.timestamp; импорт java.util.list; import java.util.uuid; импорт org.hibernate.criteria; импорт org.hibernate.session; импорт. org.springframework.orm.hibernate3.hibernateTemplate; import com.soq.card.biz.userhander; import com.soq.card.entity.users; импорт com.soq.card.tools.dbhepler; импорт com.soq.card.tools.mail.mairmail; com.soq.card.web.base.baseAction;/** * @author javen * @email [email protected] * */public Class PasseMailAction Extends BaseAction {частные пользователи; частный пользователь пользователь пользователь; Приватная строковая электронная почта; частная строка SID; частное имя пользователя; public String sendmail () {try {hibernateTemplate ht = this.getuserhander (). getusersdao (). gethibernateTemplate (); SessionFactory Factory = ht.getSessionFactory (); Session Session = factory.opensession (); Критерии критериев = session.createcriteria (users.class); Criteria.Add (RESTIRCTIONS.EQ ("LoginName", Email)); Список <users> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); Mail Mail = new Mail (); String secretKey = uuid.randomuuid (). ToString (); // Ключевая временная метка устарела = новая временная метка (System.CurrentTimeMillis () + 30 * 60 * 1000); // Срок действия истечения через 30 минут date = streadate.gettime ()/ 1000 * 1000; // Игнорировать Milliseconds mysql. Время вывода игнорирует Milliseconds dbhepler Bhepler = new dbhepler (););););););););); String sql = "Обновление пользователей SET redled =?, ValidataCode =? Где loginName =?;"; "; String str [] = {streadate+"", secretKey, users.getLoginName ()}; bhepler.addu (sql, str); //this.getuserhander().getusersdao().gethibernateTemplate().update(users); // Сохранить в базе данных System.out.println ("Имя пользователя >>>>"+users.getusername ()); String key = users.getusername () + "$" + date + "$" + secretKey; System.out.println ("Key >>>"+Key); String DigitalSignature = MD5.md5 (Key); // Цифровая сигнатура PATH = this.getRequest (). GetContextPath (); String basePath = this.getRequest (). GetScheme () + ": //" + this.getRequest (). GetServerName () + ":" + this.getRequest (). GetServerport () + path + "/"; String resetPassHref = basePath + "Контрольная связь? Sid =" + digitalsignature + "& username =" + users.getusername (); String emailContent = «Не отвечайте на эту электронную почту. Нажмите на ссылку ниже, чтобы сбросить пароль <br/> <a href =" + resetPassHref + "target = '_ Blank'>" + resetPassHref + "</a> или <a href =" + resetpasshref + "target = '_ blank'> Щелкните меня, чтобы вернуть свой пароль </a>" + "<brybref +" witnefire, чем вы нажмите на вас, expec 30 минут. mail.setto (электронная почта); mail.setfrom ("xx"); // Ваш адрес электронной почты mail.sethost ("smtp.163.com"); mail.setusername ("[email protected]"); // user mail.setpassword ("cxxx"); // password mail.setsubject ("[QR -код визитная карточка] Получить пароль вашей учетной записи"); mail.setContent (EmailContent); if (mail.sendmail ()) {System.out.println ("sendsuccesscess send"); this.getRequest (). setattribute ("mesg", "сбросить пароль. Электронная почта была отправлена, пожалуйста, войдите на адрес электронной почты, чтобы сбросить его!"); вернуть "Sendmail"; }} else {this.getRequest (). setattribute ("mesg", "Имя пользователя не существует, вы не забудете свой почтовый ящик, верно?"); вернуть "nouser"; }} catch (Exception e) {// todo: обрабатывать исключение 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"); вернуть "ошибку"; } HibernateTemplate ht = this.getuserhander (). Getusersdao (). GethibernateTemplate (); SessionFactory Factory = ht.getSessionFactory (); Session Session = factory.opensession (); Критерии критериев = session.createcriteria (users.class); Criteria.Add (RELICTIONS.EQ («Имя пользователя», имя пользователя)); Список <users> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); TimeStamp Streed = (TimeMance) users.getOutdate (); System.out.println ("СТРЕССИЕТ >>>"+СТРЕССИТЕЛЬНАЯ); if (stredate.getTime () <= System.CurrentTimeMiMillis ()) {// означает, что это.getRequest (). setAttribute («mesg», «Ссылка истек, пожалуйста, повторно примените, чтобы извлечь пароль».); System.out.println ("Time -Timeout"); вернуть "ошибку"; } String key = users.getUsername ()+"$"+streadate.getTime ()/1000*1000+"$"+users.getValidataCode (); // Система цифровой подписи. String DigitalSignature = MD5.md5 (Key); // Digital Signature System.out.println ("DigitalSignature >>>>"+DigitalSignature); if (! digitalsignature.equals (sid)) {this.getRequest (). setAttribute («mesg», «Ссылка неверна, истечет ли это истек?»); System.out.println ("Неправильный этикетка"); вернуть "ошибку"; } else {// проверка ссылки - перейти на страницу изменения пароля this.getRequest (). setAttribute ("Пользователь", пользователи); вернуть "успех"; }} else {this.getRequest (). setattribute ("mesg", "Ссылка неверна, соответствующий пользователь не может быть найден, пожалуйста, повторно применить, чтобы получить пароль."); System.out.println («Пользователь не существует»); вернуть "ошибку"; }} Общественные пользователи getUsers () {return users; } public void setUsers (пользователи пользователей) {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: Millisecond Точность будет потеряна при сохранении данных. Например: 2014-05-20 10: 30: 10.234 При хранении в базе данных MySQL он становится 2013-05-20 10: 30: 10.0. Времена становятся разными, а совпадения SID не будут равны. Поэтому я сделал операцию, которая проигнорировала точность.
Дополнение 2: Решение искаженного кода Китая в названиях ниже Linux
sun.misc.base64encoder enc = new sun.misc.base64encoder (); mailmessage.setsubject (mimeUtility.encodeText (mailInfo.getSubject (), «UTF-8», «B»)); // Решение Linux Mail Title искажено
Дополнение 3: Почему вы не вставьте SID в таблицу пользователей напрямую? Было бы нормально, чтобы напрямую сравнить SID при проверке.
Адрес загрузки исходного кода: http://pan.baidu.com/s/1cl8hkq
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.