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

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

 更新時(shí)間:2019年02月10日 11:11:20   作者:jerome_s  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)郵件找回密碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java實(shí)現(xiàn)郵件找回密碼功能的具體代碼,供大家參考,具體內(nèi)容如下

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

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

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

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

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

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

url參數(shù)(用戶名,數(shù)字簽名) ,密鑰key的生成:在每一個(gè)用戶找回密碼時(shí)候?yàn)檫@個(gè)用戶生成一個(gè)密鑰key ,url example: http://localhost:8080/user/reset_password?sid=D622D6A23FBF86FFE696B593D55351A54AEAEA77&userName=test4

生成過(guò)期時(shí)間,生成數(shù)字簽名,生成url,發(fā)送郵件.saveOrUpdate(用戶名,密鑰key,過(guò)期時(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分鐘后過(guò)期

  long
date = outDate.getTime()/1000*1000;     //忽略毫秒數(shù)

  users.setValidataCode(secretKey);
  users.setRegisterDate(outDate);
  userService.update(users); //保存到數(shù)據(jù)庫(kù)
  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 +" rel="external nofollow" target='_BLANK'>點(diǎn)擊我重新設(shè)置密碼</a>" +

    "<br/>tips:本郵件超過(guò)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)開(kāi)鏈接

以下為鏈接檢驗(yàn)代碼,驗(yàn)證通過(guò) 跳轉(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ò)誤,無(wú)法找到匹配用戶,請(qǐng)重新申請(qǐng)找回密碼.";
   model.addObject("msg",msg) ;
   logInfo(userName,"找回密碼鏈接失效");
   return
model;

  }

  Timestamp outDate = users.getRegisterDate();
  if(outDate.getTime() <= System.currentTimeMillis()){   //表示已經(jīng)過(guò)期
   msg = "鏈接已經(jīng)過(guò)期,請(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)過(guò)期了?重新申請(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ù)庫(kù)的時(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將m3u8格式轉(zhuǎn)成視頻文件的方法

    java將m3u8格式轉(zhuǎn)成視頻文件的方法

    這篇文章主要介紹了如何java將m3u8格式轉(zhuǎn)成視頻文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java Runtime類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java Runtime類詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Runtime類封裝了運(yùn)行時(shí)的環(huán)境。每個(gè) Java 應(yīng)用程序都有一個(gè) Runtime 類實(shí)例,使應(yīng)用程序能夠與其運(yùn)行的環(huán)境相連接。下面通過(guò)本文給大家分享Java Runtime類詳解,需要的朋友參考下吧
    2017-04-04
  • Java?BOI與NIO超詳細(xì)實(shí)例精講

    Java?BOI與NIO超詳細(xì)實(shí)例精講

    在Java的軟件設(shè)計(jì)開(kāi)發(fā)中,通信架構(gòu)是不可避免的,我們?cè)谶M(jìn)行不同系統(tǒng)或者不同進(jìn)程之間的數(shù)據(jù)交互,或者在高并發(fā)下的通信場(chǎng)景下都需要用到網(wǎng)絡(luò)通信相關(guān)的技術(shù),對(duì)于一些經(jīng)驗(yàn)豐富的程序員來(lái)說(shuō),Java早期的網(wǎng)絡(luò)通信架構(gòu)存在一些缺陷,這篇文章介紹Java?BOI與NIO
    2022-11-11
  • Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    本文主要介紹了Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • JAVA中的OutputStreamWriter流解析

    JAVA中的OutputStreamWriter流解析

    這篇文章主要介紹了JAVA中的OutputStreamWriter流解析,OutputStreamWriter提供了一種方便的方式將字符數(shù)據(jù)寫(xiě)入到輸出流中,并進(jìn)行字符編碼轉(zhuǎn)換,它是Java中處理字符流和字節(jié)流之間轉(zhuǎn)換的重要工具之一,需要的朋友可以參考下
    2023-10-10
  • Mybatis-Plus集成Sharding-JDBC與Flyway實(shí)現(xiàn)多租戶分庫(kù)分表實(shí)戰(zhàn)

    Mybatis-Plus集成Sharding-JDBC與Flyway實(shí)現(xiàn)多租戶分庫(kù)分表實(shí)戰(zhàn)

    這篇文章主要為大家介紹了Mybatis-Plus集成Sharding-JDBC與Flyway實(shí)現(xiàn)多租戶分庫(kù)分表實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Java的Hibernate框架中Criteria查詢使用的實(shí)例講解

    Java的Hibernate框架中Criteria查詢使用的實(shí)例講解

    這篇文章主要介紹了Java的Hibernate框架中Criteria查詢使用的實(shí)例講解,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • springboot中的controller參數(shù)映射問(wèn)題小結(jié)

    springboot中的controller參數(shù)映射問(wèn)題小結(jié)

    這篇文章主要介紹了springboot中的controller參數(shù)映射問(wèn)題小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • 關(guān)于二分法查找Java的實(shí)現(xiàn)及解析

    關(guān)于二分法查找Java的實(shí)現(xiàn)及解析

    這篇文章主要介紹了關(guān)于二分法查找Java的實(shí)現(xiàn)及解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用@EnableWebMvc輕松配置Spring MVC

    使用@EnableWebMvc輕松配置Spring MVC

    這篇文章主要為大家介紹了使用@EnableWebMvc輕松配置Spring MVC實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10

最新評(píng)論

赤壁市| 固原市| 万年县| 贵定县| 平谷区| 化隆| 东丽区| 金坛市| 宁德市| 乐清市| 鄯善县| 论坛| 金门县| 颍上县| 汽车| 康定县| 成安县| 巴楚县| 南昌县| 巨野县| 盐山县| 喀喇沁旗| 寻乌县| 宣恩县| 昔阳县| 曲松县| 湖南省| 同德县| 黄浦区| 镇巴县| 乐至县| 闸北区| 比如县| 克拉玛依市| 田东县| 西丰县| 本溪| 庆云县| 台东市| 湛江市| 湘潭市|