最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC實(shí)現(xiàn)通過郵件找回密碼功能

 更新時(shí)間:2016年10月28日 09:33:21   作者:魔流劍  
本篇文章主要介紹的是SpringMVC實(shí)現(xiàn)通過郵件找回密碼功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧。

最近開發(fā)一個(gè)系統(tǒng),有個(gè)需求就是,忘記密碼后通過郵箱找回。現(xiàn)在的系統(tǒng)在注冊(cè)的時(shí)候都會(huì)強(qiáng)制輸入郵箱,其一目的就是通過郵件綁定找回,可以進(jìn)行密碼找回。通過java發(fā)送郵件的功能我就不說了,重點(diǎn)講找回密碼。

參考別人的思路:發(fā)送郵件→請(qǐng)求郵件里的URL→驗(yàn)證url→{驗(yàn)證成功修改密碼,不成功跳轉(zhuǎn)到失敗頁面}

重點(diǎn)就是如何生成這個(gè)url和如何解析這個(gè)url.
需要注意的是一個(gè)url只能修改一次密碼,當(dāng)同一帳號(hào)發(fā)送多封郵件,只有最后一封郵件的url

 加密能防止偽造攻擊,一次url只能驗(yàn)證一次,并且綁定了用戶。生成url: 可以用UUID生成隨機(jī)密鑰。

數(shù)字簽名 = MD5(用戶名+'$'+過期時(shí)間+‘$'+密鑰key)

數(shù)據(jù)庫字段(用戶名(主鍵),密鑰key,過期時(shí)間)

url參數(shù)(用戶名,數(shù)字簽名) ,密鑰key的生成:在每一個(gè)用戶找回密碼時(shí)候?yàn)檫@個(gè)用戶生成一個(gè)密鑰key ,

url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77&userName=test4

生成過期時(shí)間,生成數(shù)字簽名,生成url,發(fā)送郵件. saveOrUpdate(用戶名,密鑰key,過期時(shí)間)

以下為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 = "用戶名不存在,你不會(huì)忘記用戶名了吧?";
      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;         //忽略毫秒數(shù)
      users.setValidataCode(secretKey);
      users.setRegisterDate(outDate);
      userService.update(users);  //保存到數(shù)據(jù)庫
      String key = users.getUserName()+"$"+date+"$"+secretKey;
      String digitalSignature = MD5.MD5Encode(key);         //數(shù)字簽名

      String emailTitle = "有方云密碼找回";
      String path = request.getContextPath();
      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      String resetPassHref = basePath+"user/reset_password?sid="+digitalSignature+"&userName="+users.getUserName();
      String emailContent = "請(qǐng)勿回復(fù)本郵件.點(diǎn)擊下面的鏈接,重設(shè)密碼<br/><a href="+resetPassHref +" target='_BLANK'>點(diǎn)擊我重新設(shè)置密碼</a>" +
          "<br/>tips:本郵件超過30分鐘,鏈接將會(huì)失效,需要重新申請(qǐng)'找回密碼'"+key+"\t"+digitalSignature;
      System.out.print(resetPassHref);
      SendMail.getInstatnce().sendHtmlMail(emailTitle,emailContent,users.getEmail());
      msg = "操作成功,已經(jīng)發(fā)送找回密碼鏈接到您郵箱。請(qǐng)?jiān)?0分鐘內(nèi)重置密碼";
      logInfo(request,userName,"申請(qǐng)找回密碼");
    }catch (Exception e){
      e.printStackTrace();
      msg="郵箱不存在?未知錯(cuò)誤,聯(lián)系管理員吧。";
    }
    map.put("msg",msg);
    return map;
  }

找回鏈接已經(jīng)發(fā)到郵箱了。進(jìn)入郵箱點(diǎn)開鏈接

以下為鏈接檢驗(yàn)代碼,驗(yàn)證通過 跳轉(zhuǎn)到修改密碼界面,否則跳轉(zhuǎn)到失敗界面

@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="鏈接不完整,請(qǐng)重新生成";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    Users users = userService.findUserByName(userName);
    if(users == null){
      msg = "鏈接錯(cuò)誤,無法找到匹配用戶,請(qǐng)重新申請(qǐng)找回密碼.";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    Timestamp outDate = users.getRegisterDate();
    if(outDate.getTime() <= System.currentTimeMillis()){     //表示已經(jīng)過期
      msg = "鏈接已經(jīng)過期,請(qǐng)重新申請(qǐng)找回密碼.";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    String key = users.getUserName()+"$"+outDate.getTime()/1000*1000+"$"+users.getValidataCode();     //數(shù)字簽名
    String digitalSignature = MD5.MD5Encode(key);
    System.out.println(key+"\t"+digitalSignature);
    if(!digitalSignature.equals(sid)) {
      msg = "鏈接不正確,是否已經(jīng)過期了?重新申請(qǐng)吧";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    model.setViewName("user/reset_password"); //返回到修改密碼的界面
    model.addObject("userName",userName);
    return model;
  }

補(bǔ)充1:Timestamp類型對(duì)象在保存到數(shù)據(jù)的時(shí)候 毫秒精度會(huì)丟失。比如:2013-10-08 10:29:10.234 存到mysql數(shù)據(jù)庫的時(shí)候 變成 2013-10-08 10:29:10.0。時(shí)間變得不相同了,sid 匹配的時(shí)候不會(huì)相等。 所以我做了忽略精度的操作。

補(bǔ)充2:解決linux下面title中文亂碼

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
mailMessage.setSubject(MimeUtility.encodeText(mailInfo.getSubject(), "UTF-8", "B"));      //解決linux郵件title亂碼

補(bǔ)充3:怎么不直接把sid插入到user表呢。驗(yàn)證的時(shí)候直接比較sid就ok了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    Java設(shè)計(jì)模式之責(zé)任鏈模式的示例詳解

    責(zé)任鏈模式是將鏈中的每一個(gè)節(jié)點(diǎn)看做是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不相同,且內(nèi)部自動(dòng)維護(hù)下一個(gè)節(jié)點(diǎn)對(duì)象,當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥伟l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象。本文將通過示例和大家詳細(xì)聊聊責(zé)任鏈模式,需要的可以參考一下
    2022-11-11
  • mybatis-plus雪花算法生成Id使用詳解

    mybatis-plus雪花算法生成Id使用詳解

    本文主要介紹了mybatis-plus雪花算法生成Id使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java通過反射機(jī)制動(dòng)態(tài)設(shè)置對(duì)象屬性值的方法

    Java通過反射機(jī)制動(dòng)態(tài)設(shè)置對(duì)象屬性值的方法

    下面小編就為大家?guī)硪黄狫ava通過反射機(jī)制動(dòng)態(tài)設(shè)置對(duì)象屬性值的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • Eclipse 安裝 SVN 在線插件教程

    Eclipse 安裝 SVN 在線插件教程

    這篇文章主要介紹了Eclipse 安裝 SVN 在線插件教程的相關(guān)資料,這里對(duì)安裝步驟進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下
    2016-11-11
  • Spring中Bean的創(chuàng)建流程詳細(xì)解讀

    Spring中Bean的創(chuàng)建流程詳細(xì)解讀

    這篇文章主要介紹了Spring中Bean的創(chuàng)建流程詳細(xì)解讀,Spring 中創(chuàng)建 Bean ,是通過調(diào)用 GetBean 方法來觸發(fā)的,所以,我們會(huì)從這個(gè)方法開始,需要的朋友可以參考下
    2023-10-10
  • Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

    Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

    Java語言中字符串類型和字節(jié)數(shù)組類型相互之間的轉(zhuǎn)換經(jīng)常發(fā)生,網(wǎng)上的分析及代碼也比較多,這篇文章將主要介紹Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-10-10
  • MybatisPlus多表連接查詢的問題及解決方案

    MybatisPlus多表連接查詢的問題及解決方案

    MybatisPlus官方并沒有提供多表連接查詢的通用解決方案,然而連接查詢是相當(dāng)普遍的需求,今天通過本文給大家介紹下MybatisPlus多表連接查詢的問題及解決方案,感興趣的朋友一起看看吧
    2022-01-01
  • 淺析java 歸并排序算法

    淺析java 歸并排序算法

    這篇文章主要簡(jiǎn)單介紹了java 歸并排序算法的工作原理及代碼,需要的朋友可以參考下
    2015-02-02
  • 使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(JDBC)詳細(xì)步驟

    使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(JDBC)詳細(xì)步驟

    這篇文章主要介紹了使用IDEA配置Tomcat和連接MySQL數(shù)據(jù)庫(JDBC)詳細(xì)步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • mybatis 遍歷foreach中or拼接的操作

    mybatis 遍歷foreach中or拼接的操作

    這篇文章主要介紹了mybatis 遍歷foreach中or拼接的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

西平县| 巴青县| 临海市| 滦平县| 天门市| 嘉黎县| 银川市| 太和县| 寿阳县| 道真| 凉城县| 綦江县| 崇阳县| 临江市| 三台县| 楚雄市| 黄浦区| 恩平市| 辛集市| 四会市| 无极县| 开鲁县| 湘阴县| 南澳县| 西安市| 长春市| 泰兴市| 清远市| 崇义县| 马公市| 洛川县| 奉节县| 始兴县| 隆回县| 罗定市| 绥中县| 偏关县| 六枝特区| 高清| 罗田县| 光泽县|