Java发送邮箱验证码、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没什么特别的,就不上代码了。

总结

以上所述是小编给大家介绍的Java发送邮箱验证码、session校验功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java使用正则表达校验手机号码示例(手机号码正则)

    复制代码 代码如下: public static boolean isMobileNumber(String mobiles) {return Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[^1^4,\\D]))\\d{8}").matcher(mobiles).matches();}

  • Java实现的校验银行卡功能示例

    本文实例讲述了Java实现的校验银行卡功能.分享给大家供大家参考,具体如下: 步骤: 首先区分借记卡和信用卡,然后就是校验卡号,最后根据银联Bin确定什么银行,Bin之后就是归属地. 本文所有数据来源于网络,不一定保证正确和完整,这里仅仅作为教学使用. Java代码: package org.luozhuang.bankcard; public class checkBankCard { /* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信

  • java使用计算md5校验码方式比较两个文件是否相同

    复制代码 代码如下: public class MD5Check {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合*/    protected char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };    protected  MessageDigest messa

  • Java校验银行卡是否正确的核心代码

    多说无益,贴代码: /** * 校验银行卡卡号 * * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId .substring(0, cardId.length() - 1)); return cardId.charAt(cardId.length() - 1) == bit; } /** * 从不含校验位的银

  • JAVA正则表达式校验qq号码的方法

    Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 正则表达式实例 一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串. .(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1". 下表列出了一些正则表达式的实例及描述: 正则表达式 描述 this is t

  • Java基于正则实现的日期校验功能示例

    本文实例讲述了Java基于正则实现的日期校验功能.分享给大家供大家参考,具体如下: private void checkDate() throws IOException { // 4种分隔符 String sep = "[-\\./_]"; // 年份 String strPattern = "^(19[4-9]\\d|20\\d{2})" + sep; strPattern += "("; // 月(1,3,5,7,8,10,12) strP

  • JAVA 18位身份证号码校验码的算法

    public static char doVerify(String id) { char pszSrc[]=id.toCharArray(); int iS = 0; int iW[]={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; char szVerCode[] = new char[]{'1','0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; int i; for(i=0;i

  • java身份证合法性校验并提取身份证有效信息

    java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下 java身份证合法性校验 /**身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表

  • 利用Java正则表达式校验邮箱与手机号

    主要是运用java.util.regex类. 复制代码 代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; public class CheckMobileAndEmail { /** * 验证邮箱地址是否正确 * @param email * @return */ public static boolean checkEmail(String email){ boolean flag = false; tr

  • Java发送邮箱验证码、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().getParamsCons

  • SpringBoot发送邮箱验证码功能

    一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring boot配置邮箱服务   在spring boot的配置文件application.yml中添加以下配置 spring: mail: username: 1963342385@qq.com password: yqc...fchj host: smtp.qq.com password是在开启邮箱服

  • java实现发送邮箱验证码

    本文实例为大家分享了java实现发送邮箱验证码的具体代码,供大家参考,具体内容如下 添加依赖 <!-- 邮箱验证码 https://mvnrepository.com/artifact/org.apache.commons/commons-email --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId>

  • nodejs实现发送邮箱验证码功能

    本文实例为大家分享了nodejs实现发送邮箱验证码的具体代码,供大家参考,具体内容如下 今天做了个小demo,是用nodejs实现注册时(当然在别的地方也是可以用的)的邮箱验证功能,大体就是往指定的邮箱发送六位验证码.以下是详细步骤. 1.使用模块:nodemailer 安装:npm install nodemailer --save 2.首先是来写一下前台注册界面,不说了,先上图.(不想看这一段的话直接跳到最后看邮箱验证码的实现) 然后实现以下以下效果(看图先),就是点击发送验证码时出现一分钟

  • Java后端产生验证码后台验证功能的实现代码

    直接跳severlet在java后台生成验证码: @RequestMapping(value="yzm.action") public void Yzm(HttpSession session,HttpServletResponse resp){ // 验证码图片的宽度. int width = 60; // 验证码图片的高度. int height = 20; // 验证码字符个数 int codeCount = 4; int x = 0; // 字体高度 int fontHeigh

  • Java struts2 validate用户登录校验功能实现

    首先贴一下搭配的环境: 配置: Eclipse4.3.2 jdk1.7_45 Mysql 5.0+ 然后切入正题: 1.login.jsp 主要是使用OGNL 标签 也可使用html form表单,调用LoginAction.action,以post 方式传输. 在LoginaAction 经过判断,然后会有提示信息,需要用到 <s:fielderror/>来显示. <%@ taglib uri="/struts-tags" prefix="s"%

  • Python+Selenium实现读取网易邮箱验证码

    前面写到了一些关于python+Selenium的基础操作 的教程,这篇文章将讲解一些实战内容. 在自动化工作中,有可能会遇到一些发送邮箱验证码类似的功能,如下 我们一般的解决思路就是 : 发送邮件—>打开邮箱—>输入邮箱账户密码—>登录邮箱—>打开未读邮件—>获取验证码—>保存验证码—>读取验证码 以下是一个实现打开网易邮箱读取未读邮件获取验证码的代码 def wangyi(self,username, password, name): dr = webdriv

  • SpringBoot使用邮箱发送验证码实现注册功能

    本文为大家分享了SpringBoot使用邮箱发送验证码实现注册功能实例,供大家参考,具体内容如下 这里有两种方式: 使用Apache Common包中开源的email组件,通过实例化HtmlEmail()对象,可通过配置外置字典.或yml等配置文件实现灵活配置: 依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId>

  • SpringBoot发送html邮箱验证码功能

    1. 效果展示(用户收到的) 2. 邮件推送管理(见以后的博客) 先看看如果管理员手动发送该如何操作 3. 后端核心代码(通用版) 3.1 SendEmailVO实体类 package com.example.han.model.VO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstr

  • Flask项目中实现短信验证码和邮箱验证码功能

    Flask是一个用Python编写的Web应用程序框架,Flask是python的web框架,最大的特征是轻便,让开发者自由灵活的兼容要开发的feature. 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队. Flask基于Werkzeug WSGI工具包和Jinja2模板引擎.两者都是Pocco项目. 这篇文章给大家介绍Flask项目中实现短信验证码和邮箱验证码功能,具体内容如下所示: 一.发送邮箱验证码 1.使用QQ邮箱发送验证码 ①配置 开启

随机推荐