تنفيذ وظيفة استرداد كلمة المرور من خلال البريد الإلكتروني
1. في الآونة الأخيرة ، قمت بتطوير نظام ولدي شرط لاسترداده من خلال بريدي الإلكتروني بعد نسيان كلمة المرور الخاصة بي. في الوقت الحاضر ، سيجبر النظام البريد الإلكتروني على إدخال عنوان البريد الإلكتروني عند التسجيل. أحد الأغراض هو استرداده من خلال ربط البريد الإلكتروني ويمكنك استرداد كلمة المرور. لن أتحدث عن وظيفة إرسال رسائل البريد الإلكتروني من خلال Java ، ولكن التركيز على استرداد كلمات المرور.
2. راجع أفكار الأشخاص الآخرين: أرسل بريدًا إلكترونيًا → طلب url في البريد الإلكتروني → تحقق من url → {تحقق من تعديل كلمة المرور بنجاح ، ولكن القفز إلى الصفحة الفاشلة إذا فشل}
النقطة المهمة هي كيفية إنشاء عنوان URL هذا وكيفية تحليل عنوان URL هذا.
تجدر الإشارة إلى أن عنوان URL لا يمكنه تعديل كلمة المرور إلا مرة واحدة. عندما يتم إرسال رسائل بريد إلكتروني متعددة بواسطة نفس الحساب ، لا يوجد سوى عنوان بريد إلكتروني عنوان URL للبريد الإلكتروني الأخير.
3. التشفير يمكن أن يمنع هجمات التزوير. لا يمكن التحقق من عنوان URL إلا مرة واحدة وربط المستخدم. إنشاء عنوان URL: يمكنك استخدام UUID لإنشاء مفتاح عشوائي.
توقيع رقمي = md5 (اسم المستخدم +'' +وقت انتهاء الصلاحية +'' +وقت انتهاء الصلاحية +'' +مفتاح مفتاح)
حقل قاعدة البيانات (اسم المستخدم (المفتاح الأساسي) ، مفتاح المفتاح ، وقت انتهاء الصلاحية)
معلمات url (اسم المستخدم ، التوقيع الرقمي) ، توليد المفاتيح: قم بإنشاء مفتاح مفتاح لكل مستخدم عند استرداد كلمة المرور ،
توليد وقت انتهاء الصلاحية ، وإنشاء توقيع رقمي ، وإنشاء عنوان URL ، وإرسال البريد الإلكتروني. addu (اسم المستخدم ، المفتاح ، وقت انتهاء الصلاحية)
قاعدة البيانات المستخدمة على النحو التالي:
كلمة المرور لاسترداد عنوان البريد الإلكتروني هي كما يلي:
package com.soq.card.web.action ؛ استيراد java.sql.timestamp ؛ استيراد java.util.list ؛ استيراد 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 ؛ import com.saq.card.tools.dbhepler com.soq.card.web.base.baseaction ؛/** * author javen * eMail [email protected] * */public class passemailaction يمتد BaseAction {المستخدمين الخاصون ؛ المستخدم الخاص المستخدم. البريد الإلكتروني الخاص بالسلسلة الخاصة ؛ سلسلة خاصة اسم المستخدم الخاص بالسلسلة الخاصة ؛ SendMail السلسلة العامة () {try {hibernatetemplate ht = this.getuserhander (). getUsersdao (). SessionFactory Factory = ht.getSessionFactory () ؛ جلسة الجلسة = المصنع. opensession () ؛ معايير المعايير = session.createcriteria (user.class) ؛ المعايير. قائمة <Susts> list = conteria.list () ؛ if (list.size ()> 0) {users = list.get (0) ؛ البريد الإلكتروني = البريد الجديد () ؛ String secretKey = uuid.randomuuid (). toString () ؛ // مفتاح Timestamp Ordate = timestamp جديد (System.CurrentTimeMillis () + 30 * 60 * 1000) ؛ // انتهت صلاحيته بعد 30 دقيقة تاريخ = OrghTate.getTime ()/ 1000 * 1000 ؛ // تجاهل milliseconds mysql وقت الانسحاب يتجاهل milliseconds dbhepler bhepler = new dhepler () ؛ String SQL = "Update Uperation Set Outrate =؟ String str [] = {Outrate+"" ، secretKey ، user.getLoginName ()} ؛ bhepler.addu (sql ، str) ؛ //this.getuserhander().getusersdao().gethibernateTemplate().update(users) ؛ // حفظ إلى database system.out.println ("username >>>>"+user.getusername ()) ؛ string key = user.getUserName () + "$" + date + "$" + secretKey ؛ System.out.println ("key >>>"+key) ؛ String DigitalSIgNatureatureatureature = md5.md5 (مفتاح) ؛ // مسار سلسلة التوقيع الرقمي = this.getRequest (). getContextPath () ؛ String basePath = this.getRequest (). getScheme () + ": //" + this.getRequest (). getServerName () + ":" + this.getRequest (). getServerPort () + path + "/" ؛ string resetPassShref = basePath + "checklink؟ sid =" + digitalsignature + "& username =" + user.getUserName () ؛ سلسلة eMailContent = "لا ترد على هذا البريد الإلكتروني. انقر فوق الرابط أدناه لإعادة تعيين كلمة المرور الخاصة بك <br/> <a href =" + resetpasshref + "target = '_ blank'>" + repasshref + " أكثر من 30 دقيقة. mail.setto (البريد الإلكتروني) ؛ mail.setfrom ("xx") ؛ // عنوان البريد الإلكتروني الخاص بك mail.sethost ("smtp.163.com") ؛ mail.setUserName ("[email protected]") ؛ // المستخدم mail.setPassword ("CXXX") ؛ // password mail.setsubject ("[QR Code Business Card] استرداد كلمة مرور حسابك") ؛ mail.setContent (البريد الإلكتروني) ؛ if (mail.sendmail ()) {system.out.println ("sendsucciscly send") ؛ this.getRequest (). setAttribute ("mesg" ، "إعادة تعيين كلمة المرور تم إرسال البريد الإلكتروني ، يرجى تسجيل الدخول إلى عنوان البريد الإلكتروني لإعادة تعيينه!") ؛ إرجاع "Sendmail" ؛ }} آخر {this.getRequest (). setAttribute ("mesg" ، "اسم المستخدم غير موجود ، لن تنسى صندوق البريد الخاص بك ، أليس كذلك؟") ؛ العودة "Nouser" ؛ }} catch (استثناء e) {// todo: التعامل مع الاستثناء e.printstacktrace () ؛ } إرجاع فارغ ؛ } السلسلة العامة checkResetLink () {system.out.println ("sid >>>" + sid) ؛ if (sid.equals ("") || username.equals ("")) {this.getRequest (). System.out.println (">>>>> null") ؛ إرجاع "خطأ" ؛ } hibernatetemplate ht = this.getuserhander (). getUsersdao (). SessionFactory Factory = ht.getSessionFactory () ؛ جلسة الجلسة = المصنع. opensession () ؛ معايير المعايير = session.createcriteria (user.class) ؛ المعايير. قائمة <Susts> list = conteria.list () ؛ if (list.size ()> 0) {users = list.get (0) ؛ Timestamp Ordate = (timestamp) مستخدمي. getOutDate () ؛ System.out.println ("Ordate >>>"+Outrate) ؛ if (outherttime.getTime () <= system.currentTimeMillis ()) {// يعني أن this.getRequest (). setAttribute ("mesg" ، "انتهت صلاحية الرابط ، يرجى إعادة تقديم كلمة المرور.") ؛ system.out.println ("time timeout") ؛ إرجاع "خطأ" ؛ } string key = users.getUserName ()+"$"+Ordate.getTime ()/1000*1000+"$"+user.getValidatacode () ؛ // Digital Signature System.out.println ("Key Link》"+Key) ؛ String DigitalSIgNatureatureatureatureature = md5.md5 (KEY) ؛ // Signature System.out.println ("DigitalSignature >>>>"+digitalsignature) ؛ if (! digitalsignature.equals (sid)) {this.getRequest (). system.out.println ("label label") ؛ إرجاع "خطأ" ؛ } آخر {// التحقق من الارتباط هو الانتقال إلى صفحة تعديل كلمة المرور this.getRequest (). setAttribute ("user" ، user) ؛ إرجاع "النجاح" ؛ }} آخر {this.getRequest (). setAttribute ("mesg" ، "الرابط غير صحيح ، لا يمكن العثور على المستخدم المطابق ، يرجى إعادة تقديم كلمة المرور.") ؛ System.out.println ("المستخدم غير موجود") ؛ إرجاع "خطأ" ؛ }} المستخدمين العامين getUsers () {return user ؛ } public void setUsers (المستخدمون المستخدمون) {this.users = user ؛ } المستخدم العام getUserhander () {return userhander ؛ } public void setuserhander (userhander userhander) {this.userHander = userHander ؛ } السلسلة العامة getEmail () {return email ؛ } public void setemail (string email) {this.email = email ؛ } السلسلة العامة getSid () {return sid ؛ } public void setSid (String Sid) {this.sid = sid ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ }}
الملحق 1: ستضيع دقة المللي ثانية عند حفظ البيانات. على سبيل المثال: 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 مشوه
الملحق 3: لماذا لا تدخل SID في جدول المستخدمين مباشرة؟ سيكون من المقبول مقارنة SID مباشرة عند التحقق.
رمز المصدر عنوان تنزيل العنوان: http://pan.baidu.com/s/1cl8hkq
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.