发送邮箱验证码、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没什么特别的,就不上代码了。
以上就是我写的一个小样例吧,一种方式思路。
发送邮箱验证码、session校验的更多相关文章
- tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
		本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ... 
- 本博文将一步步带领你实现抽屉官网的各种功能:包括登陆、注册、发送邮箱验证码、登陆验证码、页面登陆验证、发布文章、上传图片、form验证、点赞、评论、文章分页处理以及基于tronado的后端和ajax的前端数据处理。
		本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tronado的后端和ajax的 ... 
- Java实现发送邮箱验证码/注册验证链接
		本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ... 
- java代码发送邮箱验证码与qq邮箱smtp服务
		发送邮箱的类封装,在此之前需要一个jar包 javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ... 
- asp.net mvc 发送邮箱验证码
		public ActionResult Index() { /*第一种,利用Google的smtp来发送邮件*/ SmtpClient client = ); Random Rdm = new Ran ... 
- 用node实现发送邮箱验证码
		首先,你需要注册一个支持发送的邮箱,我注册是网易邮箱,然后配置smtp. 然后,创建一个node项目,输入npm install nodemailer --save安装邮件依赖. 接着创建一个文件(s ... 
- SpringBoot发送邮箱验证码
		一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring ... 
- java-阿里邮件推送服务开发 -- 发送邮箱验证码
		参考文档: 如何在 DNS 服务器上配置域名:https://help.aliyun.com/knowledge_detail/39397.html?spm=5176.2020520150.102.d ... 
- C# WinForm  使用SMTP协议发送QQ邮箱验证码
		文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言 在程序设计中,发送验证码是常见的一个功能,用 ... 
随机推荐
- 项目经验:GIS<MapWinGIS>建模第七天
			终天完成了管网地图的附加功能..实现了了管网与地图结合 
- How to solve problems
			练习是为了帮助你成长 0.Don't panic! 1.What are the inputs? 2.What are the outputs? 3.Work through some example ... 
- Maximum Subarray解题报告zz
			http://fisherlei.blogspot.com/2012/12/leetcode-maximum-subarray.html Find the contiguous subarray wi ... 
- tpcc-mysql安装测试与使用生成对比图
			1:下载tpcc-mysql的压缩包,从下面的网站进行下载 https://github.com/Percona-Lab/tpcc-mysql 也可直接从叶总博客直接下载: http://imysql ... 
- 从传输流收到意外的 EOF 或 0 个字节
			/// <summary> /// 发送POST请求 /// </summary> /// <param name="json"></pa ... 
- c#编程指南(六) 类索引器(Class Indexer)
			类索引器,可以使得你使用数组一样的方式来访问类的数据. 这种访问多见于数组,列表,词典,哈希表的快捷访问. 实际上写法很简单,写成:public T1 this[T2 i] 代码如下: using S ... 
- GoAccess分析Nginx日志详解
			一.为了提高 GoAccess 分析准确度,建议配置 nginx.conf 的 log_format 项如下: log_format main '$remote_addr - $remote_user ... 
- U-Mail邮件群发如何过滤无效地址?
			U-Mail邮件群发平台可以自动过滤掉无效和重复地址,过滤效果如下图 U-Mail邮件群发平台会将客户已经确认好是无效地址的加入无效地址库,下次再导入改无效地址就直接拒绝.邮件格式不正确的也会直接过滤 ... 
- CSAPP buffer lab记录——IA32版本
			CSAPP buffer lab为深入理解计算机系统(原书第二版)的配套的缓冲区溢出实验,该实验要求利用缓冲区溢出的原理解决5个难度递增的问题,分别为smoke(level 0).fizz(level ... 
- Django测试
			创建一个测试 ## app/tests.py import datetime from django.utils import timezone from django.test import Tes ... 
