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

作者:#城市之光 时间:2023-09-11 02:44:21 

本篇主要描述“发送邮箱验证码、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没什么特别的,就不上代码了。

总结

以上所述是小编给大家介绍的Java发送邮箱验证码、session校验功能网站的支持!

来源:https://www.cnblogs.com/city-light/archive/2018/02/09/8434442.html

标签:邮箱,验证码,session,校验
0
投稿

猜你喜欢

  • Java二分查找算法与数组处理的应用实例

    2022-07-11 01:26:57
  • Android Bitmap和Drawable相互转换的简单代码

    2022-01-26 11:09:01
  • springboot 启动项目打印接口列表的实现

    2023-08-29 02:38:44
  • 解答“60k”大佬的19道C#面试题(上)

    2023-10-03 10:20:48
  • Java使用贪心算法解决电台覆盖问题(示例详解)

    2022-12-31 05:58:48
  • Spring Boot中@Conditional注解介绍

    2022-03-03 15:23:37
  • flutter ExpansionTile 层级菜单的实现

    2023-06-15 16:04:01
  • Java Spring事务的隔离级别详解

    2022-04-25 23:07:52
  • java安全编码指南之:Number操作详解

    2021-09-27 07:14:50
  • Mybatis配置之<typeAliases>别名配置元素解析

    2023-08-02 03:09:54
  • 深入理解Spring AOP

    2023-02-09 15:14:40
  • Spring Boot修改启动端口的方法

    2022-02-10 05:49:55
  • Android--SQLite(增,删,改,查)操作实例代码

    2022-09-04 18:29:48
  • 基于C#实现简单的随机抽奖小程序

    2023-07-14 10:15:50
  • Java中FilterInputStream和FilterOutputStream的用法详解

    2023-10-02 06:47:03
  • 在 Java 中将Object 转换为 Int的四种方法

    2023-05-05 21:37:30
  • C#实现顺序表(线性表)完整实例

    2022-06-04 15:42:31
  • Ajax登录验证实现代码

    2022-02-22 10:47:51
  • C#中在WebClient中使用post发送数据实现方法

    2023-05-01 00:03:54
  • Java Socket编程详解及示例代码

    2022-06-29 07:05:27
  • asp之家 软件编程 m.aspxhome.com