亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

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

url參數(shù)(用戶名,數(shù)字簽名) ,密鑰key的生成:在每一個用戶找回密碼時候為這個用戶生成一個密鑰key ,

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

生成過期時間,生成數(shù)字簽名,生成url,發(fā)送郵件. 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 = "用戶名不存在,你不會忘記用戶名了吧?";
      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 = "請勿回復(fù)本郵件.點擊下面的鏈接,重設(shè)密碼<br/><a href="+resetPassHref +" target='_BLANK'>點擊我重新設(shè)置密碼</a>" +
          "<br/>tips:本郵件超過30分鐘,鏈接將會失效,需要重新申請'找回密碼'"+key+"\t"+digitalSignature;
      System.out.print(resetPassHref);
      SendMail.getInstatnce().sendHtmlMail(emailTitle,emailContent,users.getEmail());
      msg = "操作成功,已經(jīng)發(fā)送找回密碼鏈接到您郵箱。請在30分鐘內(nèi)重置密碼";
      logInfo(request,userName,"申請找回密碼");
    }catch (Exception e){
      e.printStackTrace();
      msg="郵箱不存在?未知錯誤,聯(lián)系管理員吧。";
    }
    map.put("msg",msg);
    return map;
  }

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

以下為鏈接檢驗代碼,驗證通過 跳轉(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="鏈接不完整,請重新生成";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    Users users = userService.findUserByName(userName);
    if(users == null){
      msg = "鏈接錯誤,無法找到匹配用戶,請重新申請找回密碼.";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    Timestamp outDate = users.getRegisterDate();
    if(outDate.getTime() <= System.currentTimeMillis()){     //表示已經(jīng)過期
      msg = "鏈接已經(jī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)過期了?重新申請吧";
      model.addObject("msg",msg) ;
      logInfo(userName,"找回密碼鏈接失效");
      return model;
    }
    model.setViewName("user/reset_password"); //返回到修改密碼的界面
    model.addObject("userName",userName);
    return model;
  }

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

補充2:解決linux下面title中文亂碼

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

補充3:怎么不直接把sid插入到user表呢。驗證的時候直接比較sid就ok了。

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

相關(guān)文章

  • Java獲取指定父節(jié)點、子節(jié)點的方法實現(xiàn)

    Java獲取指定父節(jié)點、子節(jié)點的方法實現(xiàn)

    在Java中,要獲取指定節(jié)點的父節(jié)點和子節(jié)點,通常需要使用 DOM,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Java多線程中的Callable和Future詳解

    Java多線程中的Callable和Future詳解

    這篇文章主要介紹了Java多線程中的Callable和Future詳解,創(chuàng)建線程的兩種方式,一種是直接繼承Thread,另外一種就是實現(xiàn)Runnable接口,本文提供了部分代碼,需要的朋友可以參考下
    2023-08-08
  • Java8中的Stream流式操作教程之王者歸來

    Java8中的Stream流式操作教程之王者歸來

    這篇文章主要給大家介紹了關(guān)于Java8中Stream流式操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 基于Properties類操作.properties配置文件方法總結(jié)

    基于Properties類操作.properties配置文件方法總結(jié)

    這篇文章主要介紹了Properties類操作.properties配置文件方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)及算法實例:選擇排序 Selection Sort

    Java數(shù)據(jù)結(jié)構(gòu)及算法實例:選擇排序 Selection Sort

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:選擇排序 Selection Sort,本文直接給出實現(xiàn)代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-06-06
  • Java實戰(zhàn)房屋租賃網(wǎng)的實現(xiàn)流程

    Java實戰(zhàn)房屋租賃網(wǎng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個房屋租賃網(wǎng)站,大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 關(guān)于網(wǎng)頁報錯404原因以及解決方法

    關(guān)于網(wǎng)頁報錯404原因以及解決方法

    404錯誤是網(wǎng)站常見的錯誤之一,出現(xiàn)的原因很多,解決方法也有很多種,這篇文章主要給大家介紹了關(guān)于網(wǎng)頁報錯404原因以及解決方法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 簡單快速對@RequestParam聲明的參數(shù)作校驗操作

    簡單快速對@RequestParam聲明的參數(shù)作校驗操作

    這篇文章主要介紹了簡單快速對@RequestParam聲明的參數(shù)作校驗操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java使用wait和notify實現(xiàn)線程通信

    java使用wait和notify實現(xiàn)線程通信

    這篇文章主要為大家詳細介紹了java如何使用wait和notify實現(xiàn)線程之間通信,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • java利用udp實現(xiàn)發(fā)送數(shù)據(jù)

    java利用udp實現(xiàn)發(fā)送數(shù)據(jù)

    這篇文章主要為大家詳細介紹了java利用udp實現(xiàn)發(fā)送數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論