لقد قمت مؤخرًا بتطوير نظام ولدي شرط لاسترداده من خلال بريدي الإلكتروني بعد نسيان كلمة المرور الخاصة بي. في الوقت الحاضر ، سيجبر النظام البريد الإلكتروني على إدخال عنوان البريد الإلكتروني عند التسجيل. أحد الأغراض هو استرداده من خلال ربط البريد الإلكتروني ويمكنك استرداد كلمة المرور. لن أتحدث عن وظيفة إرسال رسائل البريد الإلكتروني من خلال Java ، ولكن التركيز على استرداد كلمات المرور.
ارجع إلى أفكار الأشخاص الآخرين: إرسال رسائل البريد الإلكتروني ← طلب عناوين URL في رسائل البريد الإلكتروني → تحقق من عناوين URL → {تحقق من تعديل كلمات المرور بنجاح ، ولكن القفز إلى الصفحة الفاشلة دون نجاح}
النقطة المهمة هي كيفية إنشاء عنوان URL هذا وكيفية تحليل عنوان URL هذا.
تجدر الإشارة إلى أن عنوان URL لا يمكنه تعديل كلمة المرور إلا مرة واحدة. عندما يتم إرسال رسائل بريد إلكتروني متعددة بواسطة نفس الحساب ، فإن عنوان URL للبريد الإلكتروني الأخير هو آخر
التشفير يمكن أن يمنع هجمات التزوير. لا يمكن التحقق من عنوان URL إلا مرة واحدة وربط المستخدم. إنشاء عنوان URL: يمكنك استخدام UUID لإنشاء مفتاح عشوائي.
توقيع رقمي = MD5 (اسم المستخدم +'$' +وقت انتهاء الصلاحية +مفتاح مفتاح +'$' +)
حقل قاعدة البيانات (اسم المستخدم (المفتاح الأساسي) ، مفتاح المفتاح ، وقت انتهاء الصلاحية)
معلمات url (اسم المستخدم ، التوقيع الرقمي) ، توليد المفاتيح: قم بإنشاء مفتاح مفتاح لكل مستخدم عند استرداد كلمة المرور ،
url مثال: http: // localhost: 8080/user/reset_password؟
توليد وقت انتهاء الصلاحية ، وإنشاء توقيع رقمي ، وإنشاء عنوان URL ، وإرسال البريد الإلكتروني. SaveOrupDate (اسم المستخدم ، مفتاح المفتاح ، وقت انتهاء الصلاحية)
فيما يلي رمز springmvc
requestmapping (value = "/user/i_forget_password") responsebody map forgetpass (طلب httpservletrequest ، اسم المستخدم string) {users users = uservice.finduserByName (username) ؛ خريطة الخريطة = new hashmap <string ، string> () ؛ سلسلة msg = "" ؛ إذا كان (المستخدمين == null) {// اسم المستخدم غير موجود msg = "اسم المستخدم غير موجود ، فلن تنسى اسم المستخدم ، أليس كذلك؟" ؛ map.put ("msg" ، msg) ؛ خريطة العودة } حاول {String secretKey = uuid.randomuuid (). toString () ؛ // مفتاح Timestamp Ordate = Timestamp جديد (System.CurrentTimeMillis ()+30*60*1000) ؛ // انتهاء الصلاحية بعد 30 دقيقة تاريخ = Outrate.getTime ()/1000*1000 ؛ // تجاهل مستخدمي milliseconds.setValidatacode (secretKey) ؛ المستخدمين UserService.update (المستخدمين) ؛ // حفظ إلى مفتاح سلسلة قاعدة البيانات = المستخدمين سلسلة DigitalSIgNatureature = md5.md5encode (مفتاح) ؛ // سلسلة التوقيع الرقمية eMailTitle = "استرجاع كلمة مرور السحابة" ؛ string path = request.getContextPath () ؛ String BasePath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerPort ()+path+"/" ؛ string resetPassShref = basePath+"user/reset_password؟ sid ="+digitalsIgnature+"& username ="+users.getUserName () ؛ سلسلة البريد الإلكتروني = "لا ترد على هذا البريد الإلكتروني. انقر فوق الرابط أدناه لإعادة تعيين كلمة المرور الخاصة بك <br/> <a href ="+resetpasshref+"target = '_ blank'> انقر على إعادة تعيين كلمة المرور الخاصة بك </a> System.out.print (ResetPassShref) ؛ sendmail.getInstatnce (). sendhtmlmail (البريد الإلكتروني ، البريد الإلكتروني ، user.getemail ()) ؛ msg = "كانت العملية ناجحة ، وتم إرسال رابط استرداد كلمة المرور إلى عنوان بريدك الإلكتروني. يرجى إعادة تعيين كلمة المرور الخاصة بك في غضون 30 دقيقة" ؛ LogInfo (طلب ، اسم المستخدم ، "تطبيق لاسترداد كلمة المرور الخاصة بك") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ msg = "البريد الإلكتروني غير موجود؟ خطأ غير معروف ، يرجى الاتصال بالمسؤول." ؛ } map.put ("msg" ، msg) ؛ خريطة العودة }تم إرسال الرابط إلى عنوان البريد الإلكتروني. أدخل عنوان البريد الإلكتروني وانقر على الرابط
فيما يلي رمز التحقق من الارتباط. تحقق من أنه من خلال القفز إلى واجهة تعديل كلمة المرور ، وإلا القفز إلى الواجهة الفاشلة
requestmapping (value = "/user/reset_password" ، method = requestMethod.get) publicandview checkResetLink (String sid ، string username) {modelandview model = new modelandview ("error") ؛ سلسلة msg = "" ؛ if (sid.equals ("") || username.equals ("")) {msg = "الرابط غير مكتمل ، يرجى تجديد" ؛ model.addobject ("msg" ، msg) ؛ LogInfo (اسم المستخدم ، "استرجاع ارتباط كلمة المرور غير صالح") ؛ نموذج الإرجاع ؛ } المستخدمون = userverservice.finduserByName (اسم المستخدم) ؛ إذا كان (المستخدمين == null) {msg = "الرابط خاطئ ، لا يمكن العثور على المستخدم المطابق ، يرجى إعادة تطبيق لاسترداد كلمة المرور." ؛ model.addobject ("msg" ، msg) ؛ LogInfo (اسم المستخدم ، "رابط استرداد كلمة المرور غير صالح") ؛ نموذج الإرجاع ؛ } timestamp Ordate = user.getRegisterDate () ؛ if (outhing.getTime () <= system.currentTimeMillis ()) {// يعني أنه قد انتهى msg = "انتهت صلاحية الرابط ، يرجى إعادة تقديم طلب كلمة المرور." ؛ model.addobject ("msg" ، msg) ؛ LogInfo (اسم المستخدم ، "استرجاع ارتباط كلمة المرور غير صالح") ؛ نموذج الإرجاع ؛ } string key = users.getUserName ()+"$"+Outrate.getTime ()/1000*1000+"$"+user.getValidatacode () ؛ . System.out.println (Key+"/T"+digitalsIgnature) ؛ if (! digitalsignature.equals (SID)) {msg = "الرابط غير صحيح ، هل انتهت صلاحيته؟ model.addobject ("msg" ، msg) ؛ LogInfo (اسم المستخدم ، "رابط استرداد كلمة المرور غير صالح") ؛ نموذج الإرجاع ؛ } model.setViewName ("user/reset_password") ؛ // العودة إلى الواجهة لتعديل نموذج كلمة المرور. addobject ("اسم المستخدم" ، اسم المستخدم) ؛ نموذج الإرجاع ؛ }الملحق 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 مشوه
الملحق 3: لماذا لا تدخل SID في جدول المستخدم مباشرة؟ سيكون من المقبول مقارنة SID مباشرة عند التحقق.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.