English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SpringMVC zur Implementierung der Funktion, das Passwort über E-Mail zurückzusetzen

最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密码。

参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面}

重点就是如何生成这个url和如何解析这个url.
需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url

 加密能防止伪造攻击,一次url只能验证一次,并且绑定了用户。生成url: 可以用UUID生成随机密钥。

数字签名 = MD5(用户名+'$'+过期时间+‘$'+密钥key)

数据库字段(用户名(主键),密钥key,过期时间)

url参数(用户名,数字签名) ,密钥key的生成:在每一个用户找回密码时候为这个用户生成一个密钥key ,

url example: http://localhost:8080/user/reset_password#63;sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77&userName=test4

生成过期时间,生成数字签名,生成url,发送邮件. saveOrUpdate(用户名,密钥key,过期时间)

以下为springMvc代码

@RequestMapping(value = "/user/i_forget_password")
  @ResponseBody
  public Map forgetPass(HttpServletRequest request,String userName){
    Users users = userService.findUserByName(userName);
    Map map = new HashMap<String ,String>();
    String msg = "";
    if(users == null){       //用户名不存在
      msg = "用户名不存在,你不会忘记用户名了吧#63;";
      map.put("msg",msg);
      return map;
    }
    try{
      String secretKey= UUID.randomUUID().toString(); //密钥
      Timestamp outDate = new Timestamp(System.currentTimeMillis();+30*60*1000);//30分钟后过期
      long date = outDate.getTime();/1000*1000;         //忽略毫秒数
      users.setValidataCode(secretKey);
      users.setRegisterDate(outDate);
      userService.update(users);  //保存到数据库
      String key = users.getUserName()+"$"+date+"$"+secretKey;
      String digitalSignature = MD5.MD5Encode(key);         //Digitale Signatur
      String emailTitle = "有方云密码找回";
      String path = request.getContextPath();
      String basePath = request.getScheme();+://"+request.getServerName()+:"+request.getServerPort()+path+"/";
      String resetPassHref = basePath+"user/reset_password#63;sid="+digitalSignature;+"&userName="+users.getUserName();
      String emailContent = "请勿回复本邮件。点击下面的链接,重设密码<br/><a href="+resetPassHref +" target='_BLANK'>点击我重新设置密码</a>" +
          "<br/>提示:本邮件超过30分钟,链接将会失效,需要重新申请'找回密码'"+key;+"\t"+digitalSignature;
      System.out.print(resetPassHref);
      SendMail.getInstatnce().sendHtmlMail(emailTitle, emailContent, users.getEmail());
      msg = "操作成功,已经发送找回密码链接到您的邮箱。请在此3Passwort zurücksetzen innerhalb von 0 Minuten";
      logInfo(request,userName,"Antrag auf Passwortwiederherstellung");
    }
      e.printStackTrace();
      msg="Es gibt keine E-Mail? Unbekannter Fehler, wenden Sie sich an den Administrator.";
    }
    map.put("msg",msg);
    return map;
  }

Der Wiederherstellungsschlüssel wurde an Ihre E-Mail-Adresse gesendet. Öffnen Sie die E-Mail und klicken Sie auf die Verknüpfung

Nachstehend befindet sich der Code zur Verknüpfungserprüfung, wird bestätigt, springen Sie zum Passwortänderungsinterface, andernfalls springen Sie zum Fehlschlaginterface

@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="Verknüpfung unvollständig, bitte generieren Sie eine neue.";
      model.addObject("msg",msg) ;
      logInfo(userName,"Der Link zur Passwortwiederherstellung ist abgelaufen");
      return model;
    }
    Users users = userService.findUserByName(userName);
    if(users == null){
      msg = "Verknüpfung ist falsch, Benutzer konnte nicht gefunden werden, bitte wenden Sie sich an die Anmeldung, um Ihr Passwort zurückzusetzen.";
      model.addObject("msg",msg) ;
      logInfo(userName,"Der Link zur Passwortwiederherstellung ist abgelaufen");
      return model;
    }
    Timestamp outDate = users.getRegisterDate();
    if(outDate.getTime() <= System.currentTimeMillis()){     //bedeutet, dass sie abgelaufen ist
      msg = "Verknüpfung ist abgelaufen, bitte wenden Sie sich an die Anmeldung, um Ihr Passwort zurückzusetzen.";
      model.addObject("msg",msg) ;
      logInfo(userName,"Der Link zur Passwortwiederherstellung ist abgelaufen");
      return model;
    }
    String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();     //Digitale Signatur
    String digitalSignature = MD5.MD5Encode(key);
    System.out.println(key+"\t"+digitalSignature);
    if(!digitalSignature.equals(sid)) {
      msg = "Verknüpfung ist falsch, ist sie abgelaufen?";63";Wenden Sie eine neue Anmeldung durch.";
      model.addObject("msg",msg) ;
      logInfo(userName,"Der Link zur Passwortwiederherstellung ist abgelaufen");
      return model;
    }
    model.setViewName("user/reset_password"); //Wechseln Sie zurück zur Änderungsansicht des Passworts
    model.addObject("userName",userName);
    return model;
  }

Zusätzliche Informationen1:Timestamp-Objekte verlieren bei der Speicherung die Millisekunden-Auflösung. Zum Beispiel:2013-10-08 10:29:10.234 Wenn es in die MySQL-Datenbank gespeichert wird, wird es zu 2013-10-08 10:29:10.0. Die Zeit ist unterschiedlich, sid ist nicht gleich, wenn es auf die Genauigkeit ignoriert wird. Daher habe ich die Operation zur Ignorierung der Genauigkeit durchgeführt.

Zusätzliche Informationen2:Lösen Sie das Problem mit dem Zerrbild des Titels in chinesischen Zeichen unter Linux

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8"B"));      //Lösen Sie das Problem mit dem Zerrbild des E-Mail-Titels unter Linux

Zusätzliche Informationen3:Warum nicht direkt sid in die user-Tabelle einfügen? Beim Überprüfen ist es ausreichend, sid zu vergleichen.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und dass Sie die Anstrengungen von呐喊教程 mehr unterstützen.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetbenutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine rechtlichen Verantwortlichkeiten. Wenn Sie urheberrechtlich relevante Inhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden von E-Mails zur Meldung von Verstößen und stellen Sie relevante Beweise zur Verfügung. Sobald nachgewiesen, wird diese Website die beanstandeten urheberrechtlichen Inhalte sofort löschen.)

Gefällt mir