发送邮箱验证码及session校验(前后台代码) - 示例参考

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

发送邮箱验证码及session校验(前后台代码) - 示例参考

更新时间为 2018 年 02 月 09 日 11 时 06 分 43 秒,作者是#城市之光。

本篇主要对“发送邮箱验证码、session 校验”相关的前台(html\js)代码和后台(java)代码进行描述,同时给出业务逻辑示例,有需要的朋友可以参考。

本篇主要描述与“发送邮箱验证码、session 校验”相关的前台(html\js)代码和后台(java)代码,以及业务逻辑示例,不多说废话,直接呈现代码。

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

2、java底层发送邮箱方法

public boolean sendEMail(Map map) {
    log.info("電子郵件接口執行開始!");
Cache.getInstance().getParamsConstant.EMAIL_FROM 这个字符串被赋值给了 from 变量。
获取缓存实例,通过该实例获取参数,参数名为 Constant.EMAIL_PWD,获取到的参数赋值给字符串 pwd。
获取到的键为"mail"的值,将其转换为字符串形式并赋值给变量 to 。
获取到的键为"subject"的值,将其转换为字符串类型并赋值给变量 subject。
从 map 中获取名为“content”的值,然后将其转换为字符串并赋值给 content 变量。
Cache 实例获取的参数中,有一个名为 Constant.EMAIL_SMTPHOST 的参数,其值被赋给了字符串 smtpHost 。
如果字符串 to 为空或者为空白字符串,或者字符串 subject 为空或者为空白字符串,或者字符串 content 为空或者为空白字符串,那么就会执行以下操作。
log.info("内容有为空项,不符合发送条件,内容为:" + content);
      return false;
    }
    try{
创建了一个名为 props 的 Properties 对象。
props 设置了属性“mail.transport.protocol”,其值为“smtp”;这是 JavaMail 规范所要求使用的协议。
props 将属性“mail.smtp.host”设置为 smtpHost;这是用于设置发件人的邮箱的 SMTP 服务器地址的操作
props 设定了一个属性,该属性名为 "mail.smtp.auth",其值为 "true";此操作是为了请求认证,而参数名称与具体的实现相关。
       // 创建Session实例对象
Session 被获取到,获取的方式是通过调用 Session.getDefaultInstance(props) 这个方法,获取到的 Session 被赋值给了 session 这个变量。
       // 创建MimeMessage实例对象
创建了一个 MimeMessage 对象,这个对象名为 message,并且是基于 session 来创建的。
       // 设置发件人
message 设定了发送者为新的 InternetAddress(from);
       // 设置收件人
message 设定接收者(Message.RecipientType.TO),通过 InternetAddress.parse(to) 来进行设置。
       // 设置发送日期
message 被设置了发送日期,这个发送日期是新的日期对象,即 new Date()。
       // 设置邮件主题
       message.setSubject(subject);
       // 设置纯文本内容的邮件正文
       message.setText(content);
       // 保存并生成最终的邮件内容
       message.saveChanges();
       // 设置为debug模式, 可以查看详细的发送 log
       session.setDebug(true);
       // 获取Transport对象
Transport 被赋值为 session 获取到的名为“smtp”的传输方式。
第 2 个参数需填写的是 QQ 邮箱的 SMTP 的授权码。什么是授权码呢?它又是怎样进行设置的呢?
       transport.connect(from, pwd);
发送时,通过 message.getAllRecipients() 获取到的是在创建邮件对象时添加的那些收件人、抄送人以及密送人。
transport 发送消息(message),并将消息发送给消息的所有接收者(message.getAllRecipients())。
       transport.close();
    }catch(Exception e){
      log.error(e.getMessage(), e);
      return false;
    }
    log.info("電子郵件接口執行完成,執行成功!");
    return true;
  }

java 的业务逻辑层会进行调用,以发送邮箱。同时,验证码会被加密并存储在 session 中。

使用 @RequestMapping 注解来映射路径为 "/sendEMail.do" 的请求。 该注解用于指定处理特定 HTTP 请求的方法。 在这里,它指定了处理发送电子邮件的请求的路径。 当接收到匹配该路径的请求时,相关的处理方法将被调用。
在这个公共方法中,接收了一个 HttpServletRequest 请求对象和一个 HttpServletResponse 响应对象,用于发送电子邮件。
这个字符串包含了一些信息,其中 success 的值为 false ,message 的值是"操作失败",returnVal 的值为空字符串。
    boolean res = false;//发送邮件标记 
    Map map = new HashMap();
    try {
从请求中获取名为“username”的参数,并将其赋值给字符串变量 username。
this.userService 找到用户名对应的用户,该用户被赋值给 User user,用户名是 username。
      if(null == user){
json 的内容为:{"success":false,"message":"无此人员","returnVal":""}
        return;
      }
      //获取当前绑定邮箱地址
获取用户的邮箱,将其赋值给字符串 mail 。
      //验证邮箱地址
如果字符串工具类 StringUtils 判断邮件为空或者字符串 "null" 与邮件相等,则执行以下操作。
json 表示的内容为:其“success”字段为 false,“message”字段的值是“当前用户尚未绑定邮箱”,“returnVal”字段为空字符串。
        return;
      }
      //生成验证码
获取验证码的操作,其结果存储在字符串 checkcode 中,该验证码是通过 Common 类的 getCode 方法获取到的。
      //发送验证码
Cache.getInstance().获取参数(Constant.UIAS_DEBUG),结果赋值给 String _debug 。
如果“1”等于_debug,那么在调试模式下,不会真正发送,而是直接回显。
map 将 "checkcode" 这个键与 checkcode 这个值进行关联。
        res = true;
      }else{//非调试模式 真实发送邮件
        //验证是否频繁发送验证码请求  单位 秒
Cache.getInstance().获取参数(Constant.EMAIL_INTERVAL_TIME),并将其赋值给字符串 intervalTime 。
从请求的会话中获取名为“emailTimeFlag”的属性,将其赋值给对象 emailTimeFlag 。
        boolean checkTime = true;
        if (emailTimeFlag != null) {
获取当前时间的毫秒数并赋值给变量 miao,将其转换为整数类型。获取存储的邮件时间标记并转换为长整型,然后用当前时间的毫秒数减去邮件时间标记的毫秒数,再除以 1000 得到秒数并赋值给变量 miao。
          if (miao <= Integer.parseInt(intervalTime)) {
            checkTime=false;
          } 
        } 
        if(checkTime){
          //组装数据
    Cache.getInstance().获取参数(Constant.EMAIL_VALIDITY)得到字符串 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{
使用 response、json 和 "encoding:UTF-8" 来渲染 Html 。
    }
  }

java 用于验证邮箱,将 session 中的验证码与提交上来的验证码进行比对

@RequestMapping("/check.do")
公共的方法用于检查(HttpServletRequest 请求对象,HttpServletResponse 响应对象)。
    String json = "{\"success\":false,\"message\":\"操作失败\",\"returnVal\":\"\"}";
    try {
      //验证码有效期校验
      String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
从请求的会话中获取名为“emailTimeFlag”的属性,将其赋值给对象 emailTimeFlag。
      if (emailTimeFlag != null) {
获取当前时间的毫秒数,将其赋值给变量 miao,计算当前时间与 emailTimeFlag 所表示时间的时间差(单位为毫秒),再将时间差除以 1000 得到秒数,最后将秒数转换为整数类型并赋值给变量 miao。
如果 miao 大于或等于将 email_validity 转换为整数后的值,那么
json 中包含两个部分,一是“success”为 false,二是“message”为“验证码已过有效期,请重新获取!”,同时“returnVal”为空字符串。
        }else{
          //在有效期内 比对验证码准确性
获取名为"checkcode"的参数值并赋值给字符串 checkcode,即 checkcode = request.getParameter("checkcode");
          // md5 2次加密验证码
使用 DigestUtils 的 md5Hex 方法对 checkcode 进行加密,得到的结果再转换为小写形式,然后再次使用 DigestUtils 的 md5Hex 方法进行加密,最终得到的结果赋值给 String 类型的 codeMd5 变量。
从请求的会话中获取名为“emailCodeFlag”的属性,将其赋值给对象 emailCodeFlag 。
判断结果 res 为 codeMd5 是否等于将 emailCodeFlag 转换为字符串后的结果
          if(res){
{"success": true, "message": "验证码通过!", "returnVal": ""}
          }else{
json 表示的信息为:成功标志为 false,消息内容是验证码不匹配,请重新核对!返回值为空字符串""。
          }
        }
      } 
    } catch (Exception e) {
      logger.error("验证码异常", e);
    }finally{
      renderHtml(response, json, "encoding:UTF-8");
    }
  }

java 处理用于展示到页面的邮箱加*号隐藏的正则表达式;java 处理用于展示到页面的手机号加*号隐藏的正则表达式

// 括号表示组,被替换的部分$n表示第n组的内容
使用正则表达式将邮件地址中的用户名部分进行替换,将除开头和结尾的字符外的其他字符替换为星号,具体为:将"(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)"中的"(\\w?)(\\w+)(\\w)"替换为"$1****$3",保留"@\\w+\\.[a-z]+(\\.[a-z]+)?"部分不变。
// 括号表示组,被替换的部分$n表示第n组的内容
phone 进行了替换操作,将其中符合 "(\\d{3})\\d{4}(\\d{4})" 模式的部分替换为 "$1****$2" 。

6、HTML 获取验证码按钮

 

7、js 函数调用 按钮60秒倒计时

//获取邮箱验证码
function start_mail_button(){
获取用户名,获取的方式是获取 id 为“username”的元素的值,并对其进行去除两端空格的操作;获取到的用户名赋值给变量 username
  if('' == username){
    ErrorMsg("请输入用户名");
    return;
  }
  $.ajax({
url 为 basePath+'/sendEMail.do',类型为 'post',数据类型为 'json'
    data: {username: username},
    success: function(data){
      if(data.success){
        SuccMsg(data.message);
        //页面获取验证码按钮样式处理
$("#btnMail").attr("disabled", true);  // 为 id 为 btnMail 的元素设置 disabled 属性为 true,使其不可用
         var count = 1 ;
         var sum = 60;
设置一个定时器,每隔一段时间就执行一个函数,这个函数会不断地被调用,直到满足某个条件或者被清除。在这个定时器中,通过一个变量 i 来控制定时器的执行和清除。具体来说,就是使用 setInterval 函数创建一个定时器,然后在定时器的回调函数中执行一些操作,最后可以使用 clearInterval 函数来清除这个定时器。
          if(count > 60){
通过 jQuery 选择器获取到 id 为“btnMail”的元素,并将其 disabled 属性设置为 false,使其可点击。
           $("#btnMail").val("获取邮箱验证码");
           clearInterval(i);
          }else{
$("#btnMail").val($("#btnMail").val() + "秒");
          }
          count++;
         },1000);
         //debug模式待填
         if(data.checkcode){
$("#checkcode").获取到的数据赋值给 data.checkcode ,然后将其赋给 $("#checkcode").val() 。
         }
      }else{
获取失败了,获取到的信息是 data.message 。
      }
    }
  });
  
}

8、提交验证码的js没什么特别的,就不上代码了。

总结

小编给大家介绍了 Java 发送邮箱验证码以及 session 校验功能。希望这些能对大家有所帮助。如果大家有疑问,可给我留言,我会及时回复。同时,非常感谢大家对脚本之家网站的支持。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读