發送郵箱驗證碼、session校驗


本篇主要描述“發送郵箱驗證碼、session校驗”相關前(html\js)后(java)台代碼,業務邏輯示例,閑話少訴,直接上代碼。

1、引入的jar包是mail-1.4.jar

2、java底層發送郵箱方法

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;
    }

3、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");
        }
    }

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

@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");
        }
    }

5、小插曲,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");

6、HTML 獲取驗證碼按鈕

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

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

//獲取郵箱驗證碼
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);
            }
            
        }
    });
        
    
}

8、提交驗證碼的js沒什么特別的,就不上代碼了。

以上就是我寫的一個小樣例吧,一種方式思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM