Baru -baru ini, saya telah mengembangkan sistem dan saya memiliki persyaratan untuk mengambilnya melalui email saya setelah melupakan kata sandi saya. Saat ini, sistem akan memaksa email untuk memasukkan alamat email saat mendaftar. Salah satu tujuannya adalah mengambilnya melalui pengikatan email dan Anda dapat mengambil kata sandi. Saya tidak akan berbicara tentang fungsi mengirim email melalui Java, tetapi fokus pada pengambilan kata sandi.
Lihat Ide Orang Lain: Kirim Email → Permintaan URL dalam Email → Verifikasi URL → {Verifikasi berhasil memodifikasi kata sandi, tetapi lompat ke halaman yang gagal tanpa berhasil}
Intinya adalah bagaimana menghasilkan URL ini dan bagaimana menguraikan URL ini.
Perlu dicatat bahwa URL hanya dapat memodifikasi kata sandi sekali. Ketika beberapa email dikirim oleh akun yang sama, hanya URL dari email terakhir
Enkripsi dapat mencegah serangan pemalsuan. URL hanya dapat diverifikasi sekali dan mengikat pengguna. Hasilkan URL: Anda dapat menggunakan UUID untuk menghasilkan kunci acak.
Digital Signature = MD5 (Nama Pengguna +'$' +Waktu Kedaluwarsa +'$' +Kunci Kunci)
Bidang Basis Data (Nama Pengguna (Kunci Utama), Kunci Kunci, Waktu Kedaluwarsa)
Parameter URL (nama pengguna, tanda tangan digital), pembuatan kunci: menghasilkan kunci kunci untuk setiap pengguna saat mengambil kata sandi,
Contoh URL: http: // localhost: 8080/user/reset_password? sid = d622d6a23fbf86ffe696b593d55351a54aeaea77 & username = test4
Hasilkan waktu kedaluwarsa, menghasilkan tanda tangan digital, menghasilkan URL, dan mengirim email. saveorupdate (nama pengguna, kunci kunci, waktu kedaluwarsa)
Berikut ini adalah kode springmvc
@RequestMapping (value = "/user/i_forget_password") @ResponseBody peta publik lupa (permintaan httpservletRequest, string username) {pengguna pengguna = userservice.finduserbyname (username); Peta peta = hashmap baru <string, string> (); String msg = ""; if (users == null) {// Nama pengguna tidak ada msg = "Nama pengguna tidak ada, Anda tidak akan melupakan nama pengguna, kan?"; peta.put ("msg", msg); peta mengembalikan; } coba {string Secretkey = uuid.randomuuid (). ToString (); // OUTDATE Timestamp Kunci = Timestamp baru (System.CurrentTimeMillis ()+30*60*1000); // kedaluwarsa setelah 30 menit tanggal panjang = outdate.getTime ()/1000*1000; // abaikan pengguna milidetik.setValidataCode (SecretKey); Users.setRegisterDate (Outdate); Userservice.update (pengguna); // Simpan ke Key String Database = Users.getUserName ()+"$"+Tanggal+"$"+Secretkey; String digitalSignature = md5.md5encode (key); // string tanda tangan digital emailTitle = "pengambilan kata sandi cloud youfang"; String path = request.getContextPath (); String basePath = request.getScheme ()+": //"+request.getServerName ()+":"+request.getServerport ()+path+"/"; String resetpasshref = Basepath+"user/reset_password? Sid ="+digitalSignature+"& username ="+user.getusername (); String emailContent = "Jangan membalas email ini. Klik tautan di bawah ini untuk mengatur ulang kata sandi Anda <br/> <a href ="+resetpasshref+"target = '_ blank'> klik saya untuk mengatur ulang kata sandi Anda </a>"+"<br/> Tips: Jika email ini melebihi 30 menit, tautan akan dikembangkan. Anda perlu kembali untuk mengetahui kembali. Babi. System.out.print (resetpasshref); Sendmail.getInstatnce (). SendHtmlmail (emailTitle, emailContent, users.getemail ()); MSG = "Operasi berhasil, dan tautan pemulihan kata sandi telah dikirim ke alamat email Anda. Harap atur ulang kata sandi Anda dalam waktu 30 menit"; loginfo (permintaan, nama pengguna, "aplikasi untuk mengambil kata sandi Anda"); } catch (Exception e) {E.PrintStackTrace (); msg = "Email tidak ada? Kesalahan yang tidak diketahui, silakan hubungi administrator."; } peta.put ("msg", msg); peta mengembalikan; }Tautan telah dikirim ke alamat email. Masukkan alamat email dan klik tautan
Berikut ini adalah kode verifikasi tautan. Pastikan dengan melompat ke antarmuka modifikasi kata sandi, jika tidak, melompat ke antarmuka yang gagal
@RequestMapping (value = "/user/reset_password", method = requestMethod.get) public ModelAndView checkResetLink (String SID, string username) {modelAndView model = new ModelAndView ("error"); String msg = ""; if (sid.equals ("") || username.equals ("")) {msg = "tautannya tidak lengkap, mohon regenerate"; model.addObject ("msg", msg); loginfo (nama pengguna, "Ambil tautan kata sandi tidak valid"); model pengembalian; } Pengguna pengguna = UsserService.FindUserbyName (nama pengguna); if (Users == null) {msg = "Tautannya salah, pengguna yang cocok tidak dapat ditemukan, silakan mengajukan permohonan kembali untuk mengambil kata sandi."; model.addObject ("msg", msg); loginfo (nama pengguna, "tautan pemulihan kata sandi tidak valid"); model pengembalian; } Timestamp outdate = users.getRegisterDate (); if (outdate.getTime () <= System.currentTimeMillis ()) {// berarti telah kedaluwarsa msg = "tautan telah kedaluwarsa, silakan ajukan kembali untuk mengambil kata sandi."; model.addObject ("msg", msg); loginfo (nama pengguna, "Ambil tautan kata sandi tidak valid"); model pengembalian; } String key = Users.getUserName ()+"$"+outDate.getTime ()/1000*1000+"$"+Users.getValidataCode (); // Digital Signature String DigitalSignature = md5.md5Encode (key); System.out.println (key+"/t"+digitalSignature); if (! DigitalSignature.Equals (SID)) {msg = "tautannya salah, apakah sudah kedaluwarsa? Menerapkan kembali"; model.addObject ("msg", msg); loginfo (nama pengguna, "tautan pemulihan kata sandi tidak valid"); model pengembalian; } model.setViewName ("user/reset_password"); // Kembali ke antarmuka untuk memodifikasi model kata sandi. model pengembalian; }Suplemen 1: Akurasi milidetik objek tipe cap waktu akan hilang ketika disimpan ke data. Sebagai contoh: 2013-10-08 10: 29: 10.234 Ketika disimpan dalam database MySQL, menjadi 2013-10-08 10: 29: 10.0. Waktu menjadi berbeda, dan kecocokan SID tidak akan sama. Jadi saya melakukan operasi yang mengabaikan akurasinya.
Suplemen 2: Selesaikan Kode Kelahiran Cina dalam Judul Di Bawah Linux
sun.misc.base64Encoder enc = new Sun.misc.base64encoder ();
mailmessage.setsubject (mimeutility.encodetext (mailinfo.getsubject (), "utf-8", "b"))); // Selesaikan judul surat Linux yang kacau
Suplemen 3: Mengapa Anda tidak memasukkan SID ke tabel pengguna secara langsung? Tidak apa -apa untuk secara langsung membandingkan SID saat memverifikasi.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.