Implementasi fungsi pemulihan kata sandi melalui email
1. 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.
2. Lihat Ide Orang Lain: Kirim Email → Permintaan URL di Email → Verifikasi URL → {Verifikasi berhasil memodifikasi kata sandi, tetapi lompat ke halaman yang gagal jika gagal}
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 ada alamat email URL dari email terakhir.
3. 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 +'' +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,
Hasilkan waktu kedaluwarsa, menghasilkan tanda tangan digital, menghasilkan URL, dan mengirim email. Addu (nama pengguna, kunci, waktu kedaluwarsa)
Basis data yang digunakan adalah sebagai berikut:
Kata sandi untuk mengambil alamat email adalah sebagai berikut:
Paket com.soq.card.web.action; impor java.sql.timestamp; impor java.util.list; impor java.util.uuid; org.hibernate.criteria; impor org.hibernate.Session; impor org.hibernate.Sessionfactory; impor org.hibernate.Session; Impor org.hibernate.Sessionfactory; impor org.hibernate. org.springframework.orm.hibernate3.hibernateTemplate; import com.soq.card.biz.userhander; import com.soq.card.entity.users; import com.soq.card.tools.dbhepler; import com.soq.card.tools.mail; impor com.sooLSOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ.SOQ. com.soq.card.web.base.baseAction;/** * @author javen * @email [email protected] * */passemailaction kelas publik memperluas basa {pengguna pengguna pribadi; userhander private userhander; email string pribadi; sid string pribadi; nama pengguna string pribadi; public string sendMail () {coba {hibernateTemplate ht = this.getUserhander (). getUsersdao (). gethibernateTemplate (); SessionFactory factory = ht.getSessionFactory (); Sesi sesi = factory.opensession (); Kriteria kriteria = session.createCriteria (Users.class); criteria.add (pembatasan.eq ("LoginName", email)); Daftar <usser> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); Mail mail = mail baru (); 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 Milidonds MySQL waktu penarikan adalah Milliseconds DBHepler BHEPLER = DBEPLER = DBHEPLER BHEPLER = DBEPLER; String sql = "Perbarui pengguna set outdate =?, Validatacode =? Di mana loginName =?;"; String str [] = {outDate+"", Secretkey, user.getLoginName ()}; bhepler.addu (sql, str); //this.getUserhander().getUsersdao().getHibNeTeMlate().update(Users); // Simpan ke basis data System.out.println ("Nama pengguna >>>"+Users.getUserName ()); String key = Users.getUserName () + "$" + Tanggal + "$" + Secretkey; System.out.println ("Key >>>"+Key); String digitalSignature = md5.md5 (key); // digital Signature String path = this.getRequest (). GetContextPath (); String BasePath = this.getRequest (). Getscheme () + ": //" + this.getRequest (). GetserverName () + ":" + this.getRequest (). GetServerport () + path + "/"; String resetpasshref = Basepath + "checkLink? Sid =" + digitalsignature + "& username =" + user.getUserName (); String emailContent = "Do not reply to this email. Click the link below to reset your password<br/><a href=" + resetPassHref + " target='_BLANK'>" + resetPassHref + "</a> Or <a href=" + resetPassHref + " target='_BLANK'>Click me to reset your password</a>" + "<br/>tips: This email will kedaluwarsa setelah lebih dari 30 menit. mail.setto (email); mail.setfrom ("xx"); // alamat email Anda mail.sethost ("smtp.163.com"); mail.setusername ("[email protected]"); // user mail.setpassword ("cxxx"); // kata sandi mail.setsubject ("[kartu bisnis kode QR] ambil kata sandi akun Anda"); mail.setContent (emailContent); if (mail. this.getRequest (). setAttribute ("mesg", "reset kata sandi email telah dikirim, silakan masuk ke alamat email untuk meresetnya!"); mengembalikan "sendmail"; }} else {this.getRequest (). setAttribute ("mesg", "nama pengguna tidak ada, Anda tidak akan melupakan kotak surat Anda, kan?"); mengembalikan "nouser"; }} catch (Exception e) {// todo: menangani pengecualian e.printstacktrace (); } return null; } public String checkResetLink () {System.out.println ("Sid >>>" + Sid); if (sid.equals ("") || username.equals ("")) {this.getRequest (). setAttribute ("mesg", "tautannya tidak lengkap, mohon regenerate"); System.out.println (">>>>> null"); mengembalikan "kesalahan"; } Hibernatetemplate ht = this.getUserhander (). GetUsersdao (). GethibernateTemplate (); SessionFactory factory = ht.getSessionFactory (); Sesi sesi = factory.opensession (); Kriteria kriteria = session.createCriteria (Users.class); kriteria.add (pembatasan.eq ("nama pengguna", nama pengguna)); Daftar <usser> list = criteria.list (); if (list.size ()> 0) {users = list.get (0); Timestamp outdate = (timestamp) user.getoutDate (); System.out.println ("Outdate >>>"+Outdate); if (outdate.getTime () <= System.currentTimeMillis ()) {// berarti this.getRequest (). setAttribute ("mesg", "tautan telah kedaluwarsa, silakan berangkat kembali untuk mengambil kata sandi."); System.out.println ("Time Timeout"); mengembalikan "kesalahan"; } String key = Users.getUserName ()+"$"+outDate.getTime ()/1000*1000+"$"+Users.getValidataCode (); // Digital Signature System.out.println ("Key Link》"+Key); String digitalSignature = md5.md5 (key); // digital Signature system.out.println ("DigitalSignature >>>" "+digitalSignature); if (! DigitalSignature.Equals (SID)) {this.getRequest (). SetAttribute ("mesg", "tautannya salah, apakah sudah kedaluwarsa? Mendaftar ulang."); System.out.println ("Label Salah"); mengembalikan "kesalahan"; } else {// verifikasi tautan adalah dengan pergi ke halaman modifikasi kata sandi this.getRequest (). setAttribute ("user", pengguna); mengembalikan "kesuksesan"; }} else {this.getRequest (). setAttribute ("mesg", "tautannya salah, pengguna yang cocok tidak dapat ditemukan, silakan jelaskan untuk mengambil kata sandi."); System.out.println ("Pengguna tidak ada"); mengembalikan "kesalahan"; }} pengguna publik getUsers () {pengembalian pengguna; } public void setUsers (pengguna pengguna) {this.users = pengguna; } Userhander publik 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; }}
Suplemen 1: Akurasi milidetik akan hilang saat menabung ke data. Sebagai contoh: 2014-05-20 10: 30: 10.234 Ketika disimpan dalam database MySQL, menjadi 2013-05-20 10: 30: 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.
Alamat unduhan kode sumber: http://pan.baidu.com/s/1cl8hkq
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.