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.
Consulte as idéias de outras pessoas: Enviar e -mails → Solicitar URLs em e -mails → Verifique os URLs → {Verifique se modifica as senhas com sucesso, mas pule para a página falhada sem sucesso}
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, apenas o URL do último email é
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 +'$' +chave de 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,
Exemplo de URL: http: // localhost: 8080/user/reset_password? sid = d622d6a23fbf86ffe696b593d55351a54aeaea77 e nome de usuário = test4
Gere tempo de validade, gera assinatura digital, gera URL e envie email. SaveorUpdate (nome de usuário, chave de chave, tempo de validade)
O seguinte é o código Springmvc
@RequestMapping (value = "/user/i_forget_password") @ResponseBody Public Map ForgetPass (httpServletRequest Solicy, string username) {usuários usuários = userservice.findUserByName (nome de usuário); Mapa mapa = novo hashmap <string, string> (); String msg = ""; if (usuários == null) {// O nome do usuário não existe msg = "o nome do usuário não existe, você não esquecerá o nome do usuário, certo?"; map.put ("msg", msg); mapa de retorno; } tente {string secretKey = uuid.randomuuid (). tostring (); // TIMESTAMP TIMES DE TIMBRADO = NOVO TIMESTAMP (SYSTEM.CURRENTTIMEMILLIS ()+30*60*1000); // Expiração após 30 minutos de duração = UPDATE.GETTIME ()/1000*1000; // ignora milissegunds users.setValidatacode (SecretKey); users.setRorGisterDate (desatualizado); userService.update (usuários); // Salvar no banco de dados String key = usuários.getUserName ()+"$"+Date+"$"+secretKey; String digitalSignature = md5.md5Encode (key); // String de assinatura digital emailTitle = "Youfang Cloud Senha Recuperação"; String path = request.getContextPath (); String basalepath = request.getScheme ()+": //"+request.getServername ()+":"+request.getServerport ()+path+"/"; String resetpasshref = BASEPATH+"User/Reset_Password? Sid ="+DigitalSignature+"& UserName ="+Users.getUserName (); String emailcontent = "Não responda a este email. Clique no link abaixo para redefinir sua senha <br/> <a href ="+redefinirpasshref+"target = '_ Blank'> Clique em mim para redefinir sua senha </a>"+"<br/> TIPS: se este email exceder 30 minutos, o link" Expir. System.out.print (reetpasshref); Sendmail.getInstatnce (). Sendhtmlmail (emailTitle, emailContent, usuários.getEmail ()); msg = "A operação foi bem -sucedida e o link de recuperação de senha foi enviado para o seu endereço de e -mail. Redefina sua senha dentro de 30 minutos"; loginfo (solicitação, nome de usuário, "aplicativo para recuperar sua senha"); } catch (Exceção e) {e.printStackTrace (); msg = "O email não existe? Erro desconhecido, entre em contato com o administrador."; } map.put ("msg", msg); mapa de retorno; }O link foi enviado para o endereço de e -mail. Insira o endereço de e -mail e clique no link
A seguir, o código de verificação do link. Verifique se pulando para a interface de modificação de senha, caso contrário, pulando para a interface com falha
@RequestMapping (value = "/user/reset_password", método = requestMethod.get) public ModelAndView CheckReSetLink (string sid, string userName) {modelAndView Model = new ModelandView ("Error"); String msg = ""; if (sid.equals ("") || nome de usuário.equals ("" ")) {msg =" o link está incompleto, regenere "; Model.AdDObject ("MSG", MSG); Loginfo (nome de usuário, "Recuperar o link de senha inválido"); modelo de retorno; } Usuários usuários = userservice.findUserbyName (nome de usuário); if (usuários == null) {msg = "O link está errado, o usuário correspondente não pode ser encontrado, reaplique novamente para recuperar a senha."; Model.AdDObject ("MSG", MSG); Loginfo (nome de usuário, "O link de recuperação de senha é inválido"); modelo de retorno; } Timestamp desatualizado = usuários.getRegisterDate (); if (desbate.gettime () <= System.currenttimemillis ()) {// significa que ele expirou msg = "O link expirou, reaplique novamente para recuperar a senha."; Model.AdDObject ("MSG", MSG); Loginfo (nome de usuário, "Recuperar o link de senha inválido"); modelo de retorno; } String key = users.getUserName ()+"$"+UPDATE.GETTIME ()/1000*1000+"$"+Users.getValidatAcode (); // Digital Signature String digitalSignature = md5.md5Encode (chave); System.out.println (chave+"/t"+digitalsignature); if (! digitalsignature.equals (sid)) {msg = "O link está incorreto, ele expirou? Reaplicar"; Model.AdDObject ("MSG", MSG); Loginfo (nome de usuário, "O link de recuperação de senha é inválido"); modelo de retorno; } model.setViewName ("user/reset_password"); // retorna à interface para modificar o modelo de senha. modelo de retorno; }Suplemento 1: A precisão de milissegundos dos objetos do tipo Timestamp será perdida quando forem salvas para os dados. Por exemplo: 2013-10-08 10: 29: 10.234 Quando armazenado no banco de dados MySQL, ele se torna 08-10-08 10: 29: 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.
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.