Implementação da função de recuperação de senha por e -mail
1. Recentemente, desenvolvi um sistema e tenho um requisito para recuperá -lo através do meu e -mail depois de esquecer minha senha. Atualmente, o sistema forçará o email a entrar no endereço de e -mail ao se registrar. Um dos propósitos é recuperá -lo através da ligação de email e você pode recuperar a senha. Não vou falar sobre a função de enviar e -mails através do Java, mas foco na recuperação de senhas.
2. Consulte as idéias de outras pessoas: envie email → Solicite URL no email → Verifique o URL → {Verifique se a senha modifique com sucesso, mas pule para a página falhada se falhar}
O ponto é como gerar esse URL e como analisar este URL.
Deve -se notar que um URL só pode modificar a senha uma vez. Quando vários e -mails são enviados pela mesma conta, existe apenas o endereço de email da URL do último email.
3. A criptografia pode evitar ataques de falsificação. O URL só pode ser verificado uma vez e vincula o usuário. Gere URL: você pode usar o UUID para gerar uma chave aleatória.
Assinatura digital = md5 (nome do usuário +'' +tempo de expiração +'' +tempo de expiração +'' +chave)
Campo do banco de dados (nome de usuário (chave primária), chave de chave, tempo de validade)
Parâmetros de URL (nome de usuário, assinatura digital), geração de chaves: gerar uma chave de chave para cada usuário ao recuperar a senha,
Gere tempo de validade, gera assinatura digital, gera URL e envie email. Addu (nome de usuário, chave, tempo de expiração)
O banco de dados usado é o seguinte:
A senha para recuperar o endereço de e -mail é a seguinte:
pacote com.soq.card.web.action; importar java.sql.timestamp; importar java.util.list; importar java.util.uuid; importar org.hibernate.criteria; importação org.hibernate.session; importação org.hibernate.sessionFactory; importação; org.springframework.orm.hibernate3.hibernateTemplate; importar com.soq.card.biz.userhander; importar com.soq.card.entity.users; import com.soq.card.tools.dbhepler; import com.coard.tools.mail; com.soq.card.web.base.baseAction;/** * @author javen * @email [email protected] * */classe pública PASSEMAILACIONACIONETENDE BASEACTION {Usuários privados; Userhander Userhander privado; e -mail privado de string; Private String Sid; Nome de usuário privado de string; public String sendmail () {tente {hibernateTemplate ht = this.getUserHander (). getUsersdao (). gethibernatetemplate (); SessionFactory Factory = ht.getSessionFactory (); Sessão session = factory.opensssion (); Critérios critérios = session.createcriteria (users.class); critério.add (restrições.eq ("loginName", email)); List <userva -se> list = critério.list (); if (list.size ()> 0) {usuários = list.get (0); Mail Mail = new Mail (); String secretKey = uuid.randomuuid (). ToString (); // Timestamp de chave timestamp desatualizado = novo Timestamp (System.currenttimemillis () + 30 * 60 * 1000); // expirou após 30 minutos de data de comprimento = outbate.getTime ()/ 1000 * 1000; // ignora o milissegundores; String sql = "Usuários de atualização define desatualizados =?, Validatacode =? Onde loginname =?;"; String str [] = {tobado+"", secretKey, users.getLoginName ()}; bhepler.addu (sql, str); //this.getUserhander().getUsersdao().gethibernatetemplate().Update(users); // Salvar no banco de dados System.out.println ("nome de usuário >>>>"+users.getUserName ()); String key = usuários.getUserName () + "$" + data + "$" + secretKey; System.out.println ("chave >>>"+key); String digitalSignature = md5.md5 (key); // assinatura digital String path = this.getRequest (). GetContextPath (); String basalepath = this.getRequest (). GetScheme () + ": //" + this.getRequest (). GetServername () + ":" + this.getRequest (). GetServerport () + path + "/"; String resetpasshref = Basepath + "checkLink? String emailcontent = "Não responda a este email. Clique no link abaixo para redefinir sua senha <br/> <a href =" + redefinirpasshref + "alvo = '_ em branco'>" + resetpasshref + "</a> ou <a href =" + resetpasshref "= '' _ em branco '> clique para ME para ME para RESOT <a href =" + RESETpasshref + "=' '_ Blank'> de 30 minutos. Mail.Setto (email); Mail.setFrom ("xx"); // seu endereço de e -mail Mail.Sethost ("Smtp.163.com"); Mail.setUserName ("[email protected]"); // user Mail.SetPassword ("CXXX"); // Senha Mail.SetSubject ("[Código de Código de Código QR] Recupere a senha da sua conta"); Mail.SetContent (emailContent); if (Mail.sendMail ()) {System.out.println ("envia -lecas envio"); this.getRequest (). SetAttribute ("MESG", "Redefinir senha O email foi enviado, faça login no endereço de email para redefini -lo!"); retornar "sendmail"; }} else {this.getRequest (). SetAttribute ("Mesg", "o nome de usuário não existe, você não esquecerá sua caixa de correio, certo?"); retornar "nouser"; }} Catch (Exceção e) {// TODO: lidar com a exceção e.printStackTrace (); } retornar nulo; } public String checkReSetLink () {System.out.println ("sid >>>" + sid); if (sid.equals ("") || nome de usuário.equals ("" ")) {this.getRequest (). setAttribute (" mesg "," o link é incompleto, por favor se regenere "); System.out.println (">>>>> nulo"); retornar "erro"; } HibernateTemplate ht = this.getUserHander (). GetUsersdao (). GethibernateTemplate (); SessionFactory Factory = ht.getSessionFactory (); Sessão session = factory.opensssion (); Critérios critérios = session.createcriteria (users.class); critério.add (restrições.eq ("nome de usuário", nome de usuário)); List <userva -se> list = critério.list (); if (list.size ()> 0) {usuários = list.get (0); Timestamp desatualizado = (timestamp) users.getOutdate (); System.out.println ("Expecto >>>"+desatualizado); if (desbate.gettime () <= system.currenttimemillis ()) {// significa que this.getRequest (). setAttribute ("Mesg", "o link expirou, reaplique novamente para recuperar a senha."); System.out.println ("tempo limite"); retornar "erro"; } String key = users.getUserName ()+"$"+Ultate.getTime ()/1000*1000+"$"+Users.getValidatAcode (); // Signature Digital System.out.println ("Link da chave》"+key); String DigitalSignature = md5.md5 (key); // Sistema de assinatura digital.out.println ("DigitalSignature >>>>"+digitalsignature); if (! digitalsignature.equals (sid)) {this.getRequest (). setAttribute ("Mesg", "o link está incorreto, expirou? reaplicar."); System.out.println ("Rótulo incorreto"); retornar "erro"; } else {// A verificação do link está indo para a página de modificação de senha this.getRequest (). SetAttribute ("Usuário", usuários); retornar "sucesso"; }} else {this.getRequest (). SetAttribute ("Mesg", "O link está incorreto, o usuário correspondente não pode ser encontrado, reaplicar para recuperar a senha."); System.out.println ("Usuário não existe"); retornar "erro"; }} usuários públicos getUsers () {retornar usuários; } public void setUsers (usuários dos usuários) {this.Users = usuários; } public userhander getUserhander () {return userhander; } public void setUserhander (userhander userhander) {this.userhander = userhander; } public String getEmail () {retornar 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 = nome de usuário; }}
Suplemento 1: A precisão de milissegundos será perdida ao economizar dados. Por exemplo: 2014-05-20 10: 30: 10.234 Quando armazenado no banco de dados MySQL, ele se torna 2013-05-20 10: 30: 10.0. Os tempos se tornam diferentes, e as partidas de Sid não serão iguais. Então, eu fiz uma operação que ignorava a precisão.
Suplemento 2: Resolva o código ilegal chinês em títulos abaixo do Linux
Sun.misc.Base64Encoder Enc = new Sun.misc.Base64Encoder (); MailMessage.SetSubject (Mimeutility.Encodetext (Mailinfo.getSubject (), "UTF-8", "B"); // Resolva o título de correio Linux iluminado
Suplemento 3: Por que você não insere o SID na tabela de usuários diretamente? Seria bom comparar diretamente SID ao verificar.
Endereço do download do código -fonte: http://pan.baidu.com/s/1cl8hkq
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.