伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

Java发送邮箱验证码、session校验功能

本篇主要描绘“发送邮箱验证码、session校验”相关前(html\js)后(java)台代码,业务逻辑示例,闲话少诉,直接上代码。
1、引入的jar包是mail-1.4.jar
2、java底层发送邮箱方法
  1. public boolean sendEMail(Map<String, Object> map) {
  2.     log.info("電子郵件接口執行開始!");
  3.     String from = Cache.getInstance().getParamsConstant.EMAIL_FROM);
  4.     String pwd = Cache.getInstance().getParams(Constant.EMAIL_PWD);
  5.     String to = String.valueOf(map.get("mail"));
  6.     String subject = String.valueOf(map.get("subject"));
  7.     String content = String.valueOf(map.get("content"));
  8.     String smtpHost = Cache.getInstance().getParams(Constant.EMAIL_SMTPHOST);
  9.     if(StringUtils.isBlank(to) || StringUtils.isBlank(subject) || StringUtils.isBlank(content)){
  10.       log.info("郵件地址("+to+")、主題("+subject+")、內容("+content+")有為空項,不符合發送條件");
  11.       return false;
  12.     }
  13.     try{
  14.        Properties props = new Properties();
  15.        props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
  16.        props.setProperty("mail.smtp.host", smtpHost); // 发件人的邮箱的 SMTP效劳器地址
  17.        props.setProperty("mail.smtp.auth", "true"); // 恳求认证,参数名称与详细实现有关
  18.        // 创建Session实例对象
  19.        Session session = Session.getDefaultInstance(props);
  20.        // 创建MimeMessage实例对象
  21.        MimeMessage message = new MimeMessage(session);
  22.        // 设置发件人
  23.        message.setFrom(new InternetAddress(from));
  24.        // 设置收件人
  25.        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
  26.        // 设置发送日期
  27.        message.setSentDate(new Date());
  28.        // 设置邮件主题
  29.        message.setSubject(subject);
  30.        // 设置纯文本内容的邮件正文
  31.        message.setText(content);
  32.        // 保管并生成最终的邮件内容
  33.        message.saveChanges();
  34.        // 设置为debug形式, 可以查看详细的发送 log
  35.        session.setDebug(true);
  36.        // 获取Transport对象
  37.        Transport transport = session.getTransport("smtp");
  38.        // 第2个参数需要填写的是QQ邮箱的SMTP的受权码,什么是受权码,它又是如何设置?
  39.        transport.connect(from, pwd);
  40.        // 发送,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
  41.        transport.sendMessage(message, message.getAllRecipients());
  42.        transport.close();
  43.     }catch(Exception e){
  44.       log.error(e.getMessage(), e);
  45.       return false;
  46.     }
  47.     log.info("電子郵件接口執行完成,執行胜利!");
  48.     return true;
  49.   }
复制代码
3、java业务逻辑层调用发送邮箱、验证码加密存储在session中
  1. @RequestMapping("/sendEMail.do")
  2.   public void sendEMail(HttpServletRequest request, HttpServletResponse response) {
  3.     String json = "{"success":false,"message":"操作失败","returnVal":""}";
  4.     boolean res = false;//发送邮件标志
  5.     Map<String, Object> map = new HashMap<String, Object>();
  6.     try {
  7.       String username = request.getParameter("username");
  8.       User user = this.userService.findUserByLoginname(username);
  9.       if(null == user){
  10.         json = "{"success":false,"message":"无此人员","returnVal":""}";
  11.         return;
  12.       }
  13.       //获取当前绑定邮箱地址
  14.       String mail = user.getEmail();
  15.       //验证邮箱地址
  16.       if(StringUtils.isBlank(mail) || "null".equals(mail)){
  17.         json = "{"success":false,"message":"当前用户尚未绑定邮箱","returnVal":""}";
  18.         return;
  19.       }
  20.       //生成验证码
  21.       String checkcode = Common.getCode();
  22.       //发送验证码
  23.       String _debug = Cache.getInstance().getParams(Constant.UIAS_DEBUG);
  24.       if("1".equals(_debug)){//调试形式 不真发送 直接回显
  25.         map.put("checkcode", checkcode);
  26.         res = true;
  27.       }else{//非调试形式 真实发送邮件
  28.         //验证是否频繁发送验证码恳求  单位 秒
  29.         String intervalTime = Cache.getInstance().getParams(Constant.EMAIL_INTERVAL_TIME);
  30.         Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
  31.         boolean checkTime = true;
  32.         if (emailTimeFlag != null) {
  33.           int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
  34.           if (miao <= Integer.parseInt(intervalTime)) {
  35.             checkTime=false;
  36.           }
  37.         }
  38.         if(checkTime){
  39.           //组装数据
  40.           String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
  41.           String vartime= String.valueOf((Integer.parseInt(email_validity)/60000));
  42.           String content = Cache.getInstance().getParams(Constant.EMAIL_CONTENT);
  43.           String subject = Cache.getInstance().getParams(Constant.EMAIL_SUBJECT);
  44.           content = content.replaceAll("\\$code", checkcode);
  45.           content = content.replaceAll("\\$time",vartime);
  46.           map.put("mail", mail);
  47.           map.put("subject", subject);
  48.           map.put("content", content);
  49.           //调用发送
  50.           res = ieMailService.sendEMail(map);
  51.         }else{
  52.           json = "{"success":false,"message":"请耐心等待,不要频繁发送验证码申请","returnVal":""}";
  53.           return;
  54.         }
  55.       }
  56.       //发送胜利后续操作
  57.       if(res){
  58.         //把验证时间放在session里
  59.         request.getSession().setAttribute("emailTimeFlag", new Date().getTime());
  60.         //把验证码放在session里  md5 2次加密验证码
  61.         String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
  62.         request.getSession().setAttribute("emailCodeFlag", codeMd5);
  63.         if("1".equals(_debug)){
  64.           json = "{"success":true,"message":"邮箱验证码发送胜利,已经待填到验证码框!","returnVal":"","checkcode":""+checkcode+""}";
  65.         }else{
  66.           json = "{"success":true,"message":"邮箱验证码发送胜利,请查收邮件!","returnVal":""}";
  67.         }
  68.       }
  69.     } catch (Exception e) {
  70.       logger.error("发送邮件验证码异常", e);
  71.     }finally{
  72.       renderHtml(response, json, "encoding:UTF-8");
  73.     }
  74.   }
复制代码
4、java验证邮箱,比对session中的验证码和提交上来的验证码
  1. @RequestMapping("/check.do")
  2.   public void check(HttpServletRequest request, HttpServletResponse response) {
  3.     String json = "{"success":false,"message":"操作失败","returnVal":""}";
  4.     try {
  5.       //验证码有效期校验
  6.       String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
  7.       Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
  8.       if (emailTimeFlag != null) {
  9.         int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
  10.         if (miao >= Integer.parseInt(email_validity)) {
  11.           json = "{"success":false,"message":"验证码已过有效期,请重新获取!","returnVal":""}";
  12.         }else{
  13.           //在有效期内 比对验证码准确性
  14.           String checkcode = request.getParameter("checkcode");
  15.           // md5 2次加密验证码
  16.           String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
  17.           Object emailCodeFlag = request.getSession().getAttribute("emailCodeFlag");
  18.           boolean res = codeMd5.equals(String.valueOf(emailCodeFlag));
  19.           if(res){
  20.             json = "{"success":true,"message":"验证码通过!","returnVal":""}";
  21.           }else{
  22.             json = "{"success":false,"message":"验证码不匹配,请重新核对!","returnVal":""}";
  23.           }
  24.         }
  25.       }
  26.     } catch (Exception e) {
  27.       logger.error("验证码异常", e);
  28.     }finally{
  29.       renderHtml(response, json, "encoding:UTF-8");
  30.     }
  31.   }
复制代码
5、小插曲,java处置要展示到页面的邮箱和手机号加*号隐藏的正则表达式
  1. // 括号表示组,被交换的部分$n表示第n组的内容
  2.         mail = mail.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
  3. // 括号表示组,被交换的部分$n表示第n组的内容
  4.         phone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
复制代码
6、HTML 获取验证码按钮                 
  1. <input id="btnMail" type="button"  value="获取邮件验证码" />
复制代码
7、js 函数调用  按钮60秒倒计时
  1. //获取邮箱验证码
  2. function start_mail_button(){
  3.   var username = $('#username').val().trim();//用戶名
  4.   if('' == username){
  5.     ErrorMsg("请输入用户名");
  6.     return;
  7.   }
  8.   $.ajax({
  9.     url: basePath+'/sendEMail.do',type: 'post',dataType: 'json',
  10.     data: {username: username},
  11.     success: function(data){
  12.       if(data.success){
  13.         SuccMsg(data.message);
  14.         //页面获取验证码按钮款式处置
  15.          $("#btnMail").attr('disabled','disabled');
  16.          var count = 1 ;
  17.          var sum = 60;
  18.          var i = setInterval(function(){
  19.           if(count > 60){
  20.            $("#btnMail").attr('disabled',false);
  21.            $("#btnMail").val("获取邮箱验证码");
  22.            clearInterval(i);
  23.           }else{
  24.            $("#btnMail").val("剩余"+parseInt(sum - count)+'秒');
  25.           }
  26.           count++;
  27.          },1000);
  28.          //debug形式待填
  29.          if(data.checkcode){
  30.            $("#checkcode").val(data.checkcode);
  31.          }
  32.       }else{
  33.         ErrorMsg("获取失败!"+data.message);
  34.       }
  35.     }
  36.   });
  37. }
复制代码
8、提交验证码的js没什么特别的,就不上代码了。
总结
以上所述是小编给大家介绍的Java发送邮箱验证码、session校验功能,希望对大家有所协助,假设大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感激大家对网站网站的支持!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

JC张
注册会员
主题 18
回复 17
粉丝 0
|网站地图
快速回复 返回顶部 返回列表