Недавно я разработал систему, и у меня есть требование, чтобы получить ее по электронной почте после того, как забыл свой пароль. В настоящее время система заставит электронное письмо ввести адрес электронной почты при регистрации. Одна из целей - извлечь его через привязку по электронной почте, и вы можете получить пароль. Я не буду говорить о функции отправки электронных писем через Java, но сосредоточиться на получении паролей.
Обратитесь к идеям других людей: отправьте электронные письма → запрос URL -адреса в электронных письмах → проверка URL -адресов → {Проверьте успешно изменение паролей, но без успеха перейдите на неудачную страницу}
Дело в том, как генерировать этот URL и как проанализировать этот URL.
Следует отметить, что URL может изменить пароль только один раз. Когда в одной и той же учетной записи отправляются несколько электронных писем, только URL -адрес последнего электронного письма
Шифрование может предотвратить подделки. URL может быть проверен только один раз и связывает пользователя. Создание URL: вы можете использовать UUID для генерации случайного ключа.
Digital Signature = MD5 (имя пользователя +'$' +время истечения срока действия +'$' +клавиша ключа)
Поле базы данных (имя пользователя (первичная клавиша), ключ, время истечения)
параметры URL (имя пользователя, цифровая подпись), генерация ключей: генерируйте ключ для каждого пользователя при получении пароля,
Пример URL: http: // localhost: 8080/user/reset_password? sid = d622d6a23fbf86ffe696b593d55351a54aeaea77 и username = test4
Создайте время истечения, генерируйте цифровую подпись, генерируйте URL и отправьте электронное письмо. SaveAtorUpdate (имя пользователя, клавиша клавиши, время истечения)
Ниже приведено код SpringMVC
@Requestmapping (value = "/user/i_forget_password") @Responsebody public map partingpass (httpservletrequest, string username) {users = userservice.finduserbyname (username); MAP MAP = NEW HASHMAP <String, String> (); String msg = ""; if (users == null) {// Имя пользователя не существует msg = "Имя пользователя не существует, вы не забудете имя пользователя, верно?"; map.put ("msg", msg); карта возврата; } try {string secretKey = uuid.randomuuid (). toString (); // Ключевая метка времени устаревшей = новая временная метка (System.CurrentTimeMillis ()+30*60*1000); // Срок годности через 30 минут дата = streadate.gettime ()/1000*1000; // Игнорировать Milliseconds users.setValidataCode (SecretKey); users.setRegisterDate (устаревшего); userservice.update (пользователи); // Сохранить в базе данных String Key = users.getUsername ()+"$"+date+"$"+secretKey; String DigitalSignature = MD5.md5encode (Key); // цифровая подпись строки emailtitle = "youfang облачный пароль поиск"; String path = request.getContextPath (); String basePath = request.getScheme ()+": //"+request.getServername ()+":"+request.getServerport ()+path+"/"; String resetPassHref = basePath+"user/reset_password? Sid ="+digitalsignature+"& username ="+users.getusername (); String emailContent = «Не отвечайте на эту электронную почту. Нажмите на ссылку ниже, чтобы сбросить свой пароль <br/> <a href =»+resetPassHref+"target = '_ Blank'> Нажмите меня, чтобы сбросить свой пароль </a>"+"<br/> Советы: если эта электронная почта превышает 30 минут, ссылка истекает. Вам нужно повторно применить для 'reltive password' key+"/to-alegure. System.out.print (ResetPassHref); Sendmail.getinstatnce (). Sendhtmlmail (emailtitle, emailcontent, users.getemail ()); MSG = «Операция была успешной, и ссылка на восстановление пароля была отправлена на ваш адрес электронной почты. Пожалуйста, сбросьте пароль в течение 30 минут»; loginfo (запрос, имя пользователя, «Приложение для получения вашего пароля»); } catch (Exception e) {e.printstackTrace (); msg = "Электронная почта не существует? Неизвестная ошибка, пожалуйста, свяжитесь с администратором."; } map.put ("msg", msg); карта возврата; }Ссылка была отправлена на адрес электронной почты. Введите адрес электронной почты и нажмите на ссылку
Ниже приведен код проверки ссылки. Убедитесь, что перепрыгнув на интерфейс модификации пароля, в противном случае прыгая на неудачный интерфейс
@RequestMapping (value = "/user/reset_password", method = requestMethod.get) public model и checkresetlink (String Sid, String userName) {modelAndView Model = new ModelAndView ("error"); String msg = ""; if (sid.equals ("") || username.equals ("")) {msg = "Ссылка неполна, пожалуйста, регенерируйте"; model.addobject ("MSG", MSG); loginfo (имя пользователя, "Получить ссылку на пароль недействительный"); вернуть модель; } Users users = userservice.finduserbyname (имя пользователя); if (users == null) {msg = "Ссылка неверна, соответствующий пользователь не может быть найдена, пожалуйста, повторно поместите в поиска пароля."; model.addobject ("MSG", MSG); LoginFo (имя пользователя, "ссылка на восстановление пароля недействительна"); вернуть модель; } TimeStamp redlect = users.getregisterDate (); if (redledte.getTime () <= System.CurrentTimeMiMillis ()) {// означает, что она истек MSG = «Срок действия ссылки истек, пожалуйста, повторно примените, чтобы получить пароль.»; model.addobject ("MSG", MSG); loginfo (имя пользователя, "Получить ссылку на пароль недействительный"); вернуть модель; } String key = users.getUsername ()+"$"+streadate.gettime ()/1000*1000+"$"+users.getValidataCode (); // цифровая подпись строки digitalsignature = md5.md5encode (key); System.out.println (key+"/t"+digitalsignature); if (! digitalsignature.equals (sid)) {msg = "Ссылка неверна, истек ли это истек? повторно"; model.addobject ("MSG", MSG); LoginFo (имя пользователя, "ссылка на восстановление пароля недействительна"); вернуть модель; } model.setViewName ("user/reset_password"); // Вернуться в интерфейс для изменения модели пароля. вернуть модель; }Дополнение 1: Миллисекундная точность объектов типа временной метки будет потеряна, когда они будут сохранены в данных. Например: 2013-10-08 10: 29: 10.234 При сохранении в базе данных MySQL он становится 2013-10-08 10: 29: 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 при проверке.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.