Java發送郵箱驗證碼、session校驗功能

本篇主要描述「發送郵箱驗證碼、session校驗」相關前(htmljs)後(java)臺代碼,業務邏輯示例,閒話少訴,直接上代碼。html

一、引入的jar包是mail-1.4.jarjava

二、java底層發送郵箱方法ajax

public boolean sendEMail(Map<String, Object> map) {
    log.info("電子郵件接口執行開始!");
    String from = Cache.getInstance().getParamsConstant.EMAIL_FROM);
    String pwd = Cache.getInstance().getParams(Constant.EMAIL_PWD);
    String to = String.valueOf(map.get("mail"));
    String subject = String.valueOf(map.get("subject"));
    String content = String.valueOf(map.get("content"));
    String smtpHost = Cache.getInstance().getParams(Constant.EMAIL_SMTPHOST);
    if(StringUtils.isBlank(to) || StringUtils.isBlank(subject) || StringUtils.isBlank(content)){
      log.info("郵件地址("+to+")、主題("+subject+")、內容("+content+")有為空項,不符合發送條件");
      return false;
    }
    try{
       Properties props = new Properties();
       props.setProperty("mail.transport.protocol", "smtp"); // 使用的協議(JavaMail規範要求)
       props.setProperty("mail.smtp.host", smtpHost); // 發件人的郵箱的 SMTP服務器地址
       props.setProperty("mail.smtp.auth", "true"); // 請求認證,參數名稱與具體實現有關
       // 建立Session實例對象
       Session session = Session.getDefaultInstance(props);
       // 建立MimeMessage實例對象
       MimeMessage message = new MimeMessage(session);
       // 設置發件人
       message.setFrom(new InternetAddress(from));
       // 設置收件人
       message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
       // 設置發送日期
       message.setSentDate(new Date());
       // 設置郵件主題
       message.setSubject(subject);
       // 設置純文本內容的郵件正文
       message.setText(content);
       // 保存並生成最終的郵件內容
       message.saveChanges();
       // 設置爲debug模式, 能夠查看詳細的發送 log
       session.setDebug(true);
       // 獲取Transport對象
       Transport transport = session.getTransport("smtp");
       // 第2個參數須要填寫的是QQ郵箱的SMTP的受權碼,什麼是受權碼,它又是如何設置?
       transport.connect(from, pwd);
       // 發送,message.getAllRecipients() 獲取到的是在建立郵件對象時添加的全部收件人, 抄送人, 密送人
       transport.sendMessage(message, message.getAllRecipients());
       transport.close();
    }catch(Exception e){
      log.error(e.getMessage(), e);
      return false;
    }
    log.info("電子郵件接口執行完成,執行成功!");
    return true;
  }

三、java業務邏輯層調用發送郵箱、驗證碼加密存儲在session中正則表達式

@RequestMapping("/sendEMail.do")
  public void sendEMail(HttpServletRequest request, HttpServletResponse response) {
    String json = "{\"success\":false,\"message\":\"操做失敗\",\"returnVal\":\"\"}";
    boolean res = false;//發送郵件標記 
    Map<String, Object> map = new HashMap<String, Object>();
    try {
      String username = request.getParameter("username");
      User user = this.userService.findUserByLoginname(username);
      if(null == user){
        json = "{\"success\":false,\"message\":\"無此人員\",\"returnVal\":\"\"}";
        return;
      }
      //獲取當前綁定郵箱地址
      String mail = user.getEmail();
      //驗證郵箱地址
      if(StringUtils.isBlank(mail) || "null".equals(mail)){
        json = "{\"success\":false,\"message\":\"當前用戶還沒有綁定郵箱\",\"returnVal\":\"\"}";
        return;
      }
      //生成驗證碼
      String checkcode = Common.getCode();
      //發送驗證碼
      String _debug = Cache.getInstance().getParams(Constant.UIAS_DEBUG);
      if("1".equals(_debug)){//調試模式 不真發送 直接回顯
        map.put("checkcode", checkcode);
        res = true;
      }else{//非調試模式 真實發送郵件
        //驗證是否頻繁發送驗證碼請求  單位 秒
        String intervalTime = Cache.getInstance().getParams(Constant.EMAIL_INTERVAL_TIME);
        Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
        boolean checkTime = true;
        if (emailTimeFlag != null) {
          int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
          if (miao <= Integer.parseInt(intervalTime)) {
            checkTime=false;
          } 
        } 
        if(checkTime){
          //組裝數據
          String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
          String vartime= String.valueOf((Integer.parseInt(email_validity)/60000));
          String content = Cache.getInstance().getParams(Constant.EMAIL_CONTENT);
          String subject = Cache.getInstance().getParams(Constant.EMAIL_SUBJECT);
          content = content.replaceAll("\\$code", checkcode);
          content = content.replaceAll("\\$time",vartime);
          map.put("mail", mail);
          map.put("subject", subject);
          map.put("content", content);
          //調用發送
          res = ieMailService.sendEMail(map);
        }else{
          json = "{\"success\":false,\"message\":\"請耐心等待,不要頻繁發送驗證碼申請\",\"returnVal\":\"\"}";
          return;
        }
      }
      //發送成功後續操做
      if(res){
        //把驗證時間放在session裏
        request.getSession().setAttribute("emailTimeFlag", new Date().getTime());
        //把驗證碼放在session裏  md5 2次加密驗證碼
        String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
        request.getSession().setAttribute("emailCodeFlag", codeMd5);
        if("1".equals(_debug)){
          json = "{\"success\":true,\"message\":\"郵箱驗證碼發送成功,已經待填到驗證碼框!\",\"returnVal\":\"\",\"checkcode\":\""+checkcode+"\"}";
        }else{
          json = "{\"success\":true,\"message\":\"郵箱驗證碼發送成功,請查收郵件!\",\"returnVal\":\"\"}";
        }
      }
    } catch (Exception e) {
      logger.error("發送郵件驗證碼異常", e);
    }finally{
      renderHtml(response, json, "encoding:UTF-8");
    }
  }

四、java驗證郵箱,比對session中的驗證碼和提交上來的驗證碼json

@RequestMapping("/check.do")
  public void check(HttpServletRequest request, HttpServletResponse response) {
    String json = "{\"success\":false,\"message\":\"操做失敗\",\"returnVal\":\"\"}";
    try {
      //驗證碼有效期校驗
      String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
      Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
      if (emailTimeFlag != null) {
        int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
        if (miao >= Integer.parseInt(email_validity)) {
          json = "{\"success\":false,\"message\":\"驗證碼已過有效期,請從新獲取!\",\"returnVal\":\"\"}";
        }else{
          //在有效期內 比對驗證碼準確性
          String checkcode = request.getParameter("checkcode");
          // md5 2次加密驗證碼
          String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
          Object emailCodeFlag = request.getSession().getAttribute("emailCodeFlag");
          boolean res = codeMd5.equals(String.valueOf(emailCodeFlag));
          if(res){
            json = "{\"success\":true,\"message\":\"驗證碼經過!\",\"returnVal\":\"\"}";
          }else{
            json = "{\"success\":false,\"message\":\"驗證碼不匹配,請從新覈對!\",\"returnVal\":\"\"}";
          }
        }
      } 
    } catch (Exception e) {
      logger.error("驗證碼異常", e);
    }finally{
      renderHtml(response, json, "encoding:UTF-8");
    }
  }

五、小插曲,java處理要展現到頁面的郵箱和手機號加*號隱藏的正則表達式服務器

// 括號表示組,被替換的部分$n表示第n組的內容
        mail = mail.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
// 括號表示組,被替換的部分$n表示第n組的內容
        phone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

六、HTML 獲取驗證碼按鈕session

<input id="btnMail" type="button" onclick="start_mail_button();" value="獲取郵件驗證碼" />

七、js 函數調用 按鈕60秒倒計時app

//獲取郵箱驗證碼
function start_mail_button(){
  var username = $('#username').val().trim();//用戶名
  if('' == username){
    ErrorMsg("請輸入用戶名");
    return;
  }
  $.ajax({
    url: basePath+'/sendEMail.do',type: 'post',dataType: 'json',
    data: {username: username},
    success: function(data){
      if(data.success){
        SuccMsg(data.message);
        //頁面獲取驗證碼按鈕樣式處理
         $("#btnMail").attr('disabled','disabled');
         var count = 1 ;
         var sum = 60;
         var i = setInterval(function(){
          if(count > 60){
           $("#btnMail").attr('disabled',false);
           $("#btnMail").val("獲取郵箱驗證碼");
           clearInterval(i);
          }else{
           $("#btnMail").val("剩餘"+parseInt(sum - count)+'秒');
          }
          count++;
         },1000);
         //debug模式待填
         if(data.checkcode){
           $("#checkcode").val(data.checkcode);
         }
      }else{
        ErrorMsg("獲取失敗!"+data.message);
      }
    }
  });
   
}

八、提交驗證碼的js沒什麼特別的,就不上代碼了。函數

總結post

以上所述是小編給你們介紹的Java發送郵箱驗證碼、session校驗功能,但願對你們有所幫助,若是你們有任何疑問請給我留言

相關文章
相關標籤/搜索