最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

article/2025/9/27 10:06:19

最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

最近几天有人需要帮忙做一个关于发送验证码的功能,之前没有做过,于是我鼓捣一阵子,记录一下关于web项目中注册登录常用的手机验证码和邮箱验证码的发送。

作为一个演示项目,我没有使用任何框架,用了一个简单的jsp+Servlet,当然用boostrap美化了一下。代码带有注释,非常简单易懂。

一、手机验证码

由于手机短信属于增值业务,那么一般来说都是需要一些资金的。毕竟短信费是花钱的!所以一般来说都是调用第三方API来支持。

1.1、API申请

我们使用的API平台是:秒滴短信平台,

为啥用这个呢?因为他好?不一定,主要是因为他注册免费先送10块钱。做个测试功能足够了。

废话不多说,网站自行注册然后登录:
在这里插入图片描述

然后在开发者信息里面获得你自己的AUTH_TOKEN:记录一下API需要的东西
在这里插入图片描述

1.2、在配置管理中新建一个模板

这个模板就是发送验证码的模板。
在这里插入图片描述

1.3、自定义短信就要认证

注意了!

这个地方有个难处,就是必须认证以后才能发生自定义的短信内容。
我要发自定义的,所以我要认证。认证是需要公司营业执照的。
在这里插入图片描述
(太麻烦?自己搞定不了?实际上很简单,私信我,我有妙招)

看一下API接口要求:
验证码通知短信接口说明

主要的是这里:
在这里插入图片描述

反正完成了整个第三方平台的API接口以后。

1.4、编写java手机短信发送代码

我们就可以开始建项目,写代码了。
新建项目什么的我都懒得说了,能做这个功能的这些都是小事情了。

看一下我的项目结构吧:
在这里插入图片描述
直接上代码了,注释都写在里面了。
为了方便理解,我们倒过来写。

新建login.jsp:

源码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+ path + "/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>手机登录</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"><link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/bootstrap-datetimepicker.min.css" />
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<style type="text/css">
#login {width: 450px;height: 100px;margin: 126px auto;
}#btn {margin-left: 100px;margin-top: -25px;width: 120px;height: 25px;font-size: 11px;
}body {background-color: #ecfcf9;
}
</style>
</head>
<script type="text/javascript">var InterValObj; //timer变量,控制时间var count = 60; //间隔函数,1秒执行var curCount;//当前剩余秒数function sendMessage() {curCount = count;$("#btn").attr("disabled", "true");$("#btn").val(curCount + "秒后可重新发送");InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次请求后台发送验证码 TODO}//timer处理函数function SetRemainTime() {if (curCount == 0) {window.clearInterval(InterValObj);//停止计时器$("#btn").removeAttr("disabled");//启用按钮$("#btn").val("重新发送验证码");} else {curCount--;$("#btn").val(curCount + "秒后可重新发送");}}
</script>
<body><div class="container"><div id="login"><fieldset><div id="legend" class=""><legend class="">用户登录</legend></div><form class="form-horizontal" role="form"><div class="form-group"><label class="col-sm-2 control-label">手机号</label><div class="col-sm-5"><input type="text" class="form-control" id="phone" name="phone"placeholder="请输入您的手机号" required></div></div><div class="form-group"><label class="col-sm-2 control-label">验证码</label><div class="col-sm-3"><input type="code" class="form-control" id="code" name="code"placeholder="验证码" required> <inputclass="btn btn-default" id="btn" name="btn" value="发送验证码"onclick="sendMessage()" /></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="button" class="btn btn-success" id="lo">手机号登录</button><a href="register.jsp" class="btn btn-info">邮箱注册</a></div></div></form></fieldset></div></div>
</body>
<script type="text/javascript">var sms = "";$("#btn").click(function() {var phone = $("#phone").val();if (phone != "") {$.ajax({url : "sendSMS",  //发送请求 type : "post",data : {"phone" : phone},success : function(result) {sms = result;}});} else {alert("请输入手机号");return false;}});$("#lo").click(function() {var code = $("#code").val();if (code == "") {alert("请输入验证码");} else {if (sms == code) {window.location.href = "success.jsp";} else {alert("验证码错误");};};});
</script>
</html>

根据ajax,我们 点击发送以后,会url : “sendSMS”, 发送请求到 sendSMS。

新建servlet类:

sendSMS.java:

package com.zout.controller;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zout.util.GetMessageCode;/*** *@class_name:SendSms*@comments:登录 -发送手机短信验证码*@param:phone*@return: code*@author:邹涛/Zoutao*@createtime:2019年2月23日*/
@WebServlet("/sendSMS")
public class SendSms extends HttpServlet {/** serialVersionUID*/private static final long serialVersionUID = 1L;@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String phone=req.getParameter("phone");//根据获取到的手机号发送验证码String code = GetMessageCode.getCode(phone); System.out.println(code);resp.getWriter().print(code);}
}

在servlet当中我们调用GetMessageCode.getCode的方法,来发送短信。

新建GetMessageCode.java:

源码:

package com.zout.util;import java.net.URLEncoder
import com.alibaba.fastjson.JSONObject;
import com.zout.common.Config;
import com.zout.common.HttpUtil;/*** *@class_name:GetMessageCode*@comments:调用手机短信API*@param:phone*@return: String*@author:邹涛/Zoutao*@createtime:2019年2月22日*/
public class GetMessageCode {private static String operation = "/industrySMS/sendSMS";//对应的API地址private static String accountSid = Config.ACCOUNT_SID;private static String to = "17121192629"; //改由前台传入private static String rod=smsCode();   //生成一个随机验证码private static String smsContent = "【柒晓白网络科技】您的验证码:"+rod+",如非本人操作,请忽略此短信。";//创建验证码public static String smsCode(){String random=(int)((Math.random()*9+1)*100000)+"";	System.out.print("random验证码:"+random);return random;}//根据相应的手机号发送验证码public static String getCode(String phone){String tmpSmsContent = null;try{tmpSmsContent = URLEncoder.encode(smsContent, "UTF-8");}catch(Exception e){e.getMessage();}String url = Config.BASE_URL + operation;String body = "accountSid=" + accountSid + "&to=" + phone + "&smsContent=" + tmpSmsContent+ HttpUtil.createCommonParam();// 提交请求String result = HttpUtil.post(url, body);//(换行符) 剔除了平台无关性System.out.println("result:" + System.lineSeparator() + result);System.out.println(result.getClass());//字符串转json对象JSONObject jsonObject = JSONObject.parseObject(result); String respCode = jsonObject.getString("respCode");System.out.println(respCode);//反馈-00000状态码标识请求成功,String defaultRespCode="00000";if(defaultRespCode.equals(respCode)){return rod;}else{return defaultRespCode;		}}}

注意:
在GetMessageCode类中,把smsContent改为你自己在平台上面建立的模板的样式,这里必须一致。

还有json是用的:import com.alibaba.fastjson.JSONObject;
阿里巴巴的jar包。

新建Config配置类

在com.zout.common包中新建Config.java:
源码:

package com.zout.common;/*** *@class_name:Config*@comments:系统常量*@param:自主填写API的授权码等信息*@return: String*@author:邹涛/Zoutao*@createtime:2019年2月23日*/
public class Config
{/*** url前半部分*/public static final String BASE_URL = "https://api.miaodiyun.com/20150822";/*** 开发者注册后系统自动生成的账号,可在官网登录后查看-修改为自己的。*/public static final String ACCOUNT_SID = "b38529a662bd4你自己的800f140";/*** 开发者注册后系统自动生成的TOKEN,可在官网登录后查看-修改为自己的。*/public static final String AUTH_TOKEN = "568ce19f6958467你自己的5080906341ae";/*** 响应数据类型, JSON或XML*/public static final String RESP_DATA_TYPE = "json";
}

我标注的地方改成你自己的,(ACCOUNT_SID和AUTH_TOKEN)最好就改这两个就好了。去官网查询到自己的。上面有写。

新建HttpUtil请求类

在com.zout.common包中新建
HttpUtil.java 源码:

package com.zout.common;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.codec.digest.DigestUtils;/*** *@class_name:HttpUtil*@comments:http请求工具*@param: 根据官网的API要求构建请求URL结构*@return: String结构*@author:邹涛/Zoutao*@createtime:2019年2月23日*/
public class HttpUtil
{/*** 构造通用参数timestamp、sig和respDataType* * @return*/public static String createCommonParam(){// 时间戳SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String timestamp = sdf.format(new Date());// 签名String sig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp);return "&timestamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE;}/*** post请求* * @param url*            功能和操作* @param body*            要post的数据* @return* @throws IOException*/public static String post(String url, String body){System.out.println("url:" + System.lineSeparator() + url);System.out.println("body:" + System.lineSeparator() + body);String result = "";try{OutputStreamWriter out = null;BufferedReader in = null;URL realUrl = new URL(url);URLConnection conn = realUrl.openConnection();// 设置连接参数conn.setDoOutput(true);conn.setDoInput(true);conn.setConnectTimeout(5000);conn.setReadTimeout(20000);conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 提交数据out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");out.write(body);out.flush();// 读取返回数据in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String line = "";boolean firstLine = true; // 读第一行不加换行符while ((line = in.readLine()) != null){if (firstLine){firstLine = false;} else{result += System.lineSeparator();}result += line;}} catch (Exception e){e.printStackTrace();}return result;}/*** 回调测试工具方法* * @param url* @param reqStr* @return*/public static String postHuiDiao(String url, String body){String result = "";try{OutputStreamWriter out = null;BufferedReader in = null;URL realUrl = new URL(url);URLConnection conn = realUrl.openConnection();// 设置连接参数conn.setDoOutput(true);conn.setDoInput(true);conn.setConnectTimeout(5000);conn.setReadTimeout(20000);// 提交数据out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");out.write(body);out.flush();// 读取返回数据in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String line = "";boolean firstLine = true; // 读第一行不加换行符while ((line = in.readLine()) != null){if (firstLine){firstLine = false;} else{result += System.lineSeparator();}result += line;}} catch (Exception e){e.printStackTrace();}return result;}
}

这个实际上就是要构建上面所写的API的请求体的方式。
必须按照人家官网的要求来,不然就接收不到你的短信发送请求。

对了,顺便在建立两个jsp文件:分别是fail.jsp和success.jsp,里面没有啥内容,就是标志一个成功一个失败即可。

上面就完成了整个手机短信发送的请求,于是我们在tomcat里面运行项目,看看:
浏览器输入:http://localhost:8080/EmailAndPhone/

手机验证码发送效果图:

输入手机号:
在这里插入图片描述点击发送。

后台:
在这里插入图片描述

手机接收短信:
在这里插入图片描述

先输入错误的:
在这里插入图片描述

在输入正确的:

在这里插入图片描述
点击登录:
在这里插入图片描述
你可以在秒滴登录自己的账号,然后查看发送状态:
在这里插入图片描述



这就完成了一个手机验证码短信的发送过程。接下来是邮箱验证码的发送。
(提醒:一个手机号码一小时之类不能重复请求4次,你可以换号码来测试,注意看后台返回状态即可。)

二、邮箱验证码

在163和qq邮箱发送邮件之间,QQ比较难一些,所我们采用QQ邮箱来做。

2.1、开启POP3/SMTP协议

做这些之前,先要去QQ邮箱里帐号设置要开启POP3/SMTP协议。
在这里插入图片描述
选择账户,然后找到下面的地方,开启:
在这里插入图片描述

开启的时候,会给你一个java邮箱的授权码,你记得记录一下。网易同样道理。
比如我的:

  • 成功开启POP3/SMTP服务: prktbfsmxxxxxj
  • 成功开启IMAP/SMTP服务: ehqvnfayxxxxxdf

由于java发送邮件这个功能比较简单,我们写一个java版和一个web版本来方便使用。

2.2、java版发送邮件:

在com.zout.util;包下新建一个Mail_java.java类来测试:
需要注意一点就是,在QQ中要求 开启SSL证书加密,否则会失败。

Mail_java.java:

package com.zout.util;import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.sun.mail.util.MailSSLSocketFactory;/*** JavaMail发送邮件: java版本-与web无关* 前提是QQ邮箱里帐号设置要开启POP3/SMTP协议* * */
public class Mail_java {public static void main(String[] args) throws Exception {Properties prop = new Properties();// 开启debug调试,以便在控制台查看prop.setProperty("mail.debug", "true");// 设置邮件服务器主机名prop.setProperty("mail.host", "smtp.qq.com");// 发送服务器需要身份验证prop.setProperty("mail.smtp.auth", "true");// 发送邮件协议名称prop.setProperty("mail.transport.protocol", "smtp");// 开启SSL加密,否则会失败MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);// 创建sessionSession session = Session.getInstance(prop);// 通过session得到transport对象Transport ts = session.getTransport();// 连接邮件服务器:邮箱类型,帐号,POP3/SMTP协议授权码 163使用:smtp.163.comts.connect("smtp.qq.com", "你自己的QQ", "prktbfsmrjhvbajj");// 创建邮件Message message = createSimpleMail(session);// 发送邮件ts.sendMessage(message, message.getAllRecipients());ts.close();}/*** @Method: createSimpleMail* @Description: 创建一封只包含文本的邮件*/public static MimeMessage createSimpleMail(Session session) throws Exception {//  获取6为随机验证码String[] letters = new String[] {"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M","0","1","2","3","4","5","6","7","8","9"};String stringBuilder ="";for (int i = 0; i < 6; i++) {stringBuilder = stringBuilder + letters[(int)Math.floor(Math.random()*letters.length)];}// 创建邮件对象MimeMessage message = new MimeMessage(session);// 指明邮件的发件人message.setFrom(new InternetAddress("你自己的@qq.com"));// 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发message.setRecipient(Message.RecipientType.TO, new InternetAddress("你自己的@qq.com"));// 邮件的标题message.setSubject("JavaMail测试");// 邮件的文本内容message.setContent("欢迎您注册【柒晓白网络科技】,账号注册验证码为(一分钟有效):"+stringBuilder+",请勿回复此邮箱", "text/html;charset=UTF-8");// 返回创建好的邮件对象return message;}
}

以上需要导入jar包:
javax.mail-1.6.1.jar

把上面要求的地方改为你自己的。
然后运行java文件。不要告诉你不会?

效果图:在这里插入图片描述如果出现报错:java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage

解决办法: 导入activation-1.1.1.jar包。

上面是一个简单的java版本,现在写一个web版本。

2.3、web版邮箱发送

同样的,我们先写jsp页面吧:

新建一个register.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>邮箱注册</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/bootstrap-datetimepicker.min.css" />
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script><style type="text/css">
#register {width: 450px;height: 100px;margin: 50px auto;
}#btn {margin-left: 197px;margin-top: -24px;width: 120px;height: 25px;font-size: 14px;color: #7904c9
}body {background-color: #ecfcf9;
}
</style><script type="text/javascript">$(function(){$("#btn").click(function(){if($("#email").val()){$.ajax({type:"POST",url :"SendEmailServlet?random"+Math.random(),data:{email:$("#email").val(),},success:function(data){alert("验证码发送成功,请注意查收。");},})}else{alert("邮箱发送失败");$("#notice").html("请填写邮箱");setTimeout(function(){$("#notice").hide();},1000);}});//  判断用户是否可以注册$("#submit").click(function() {if ($("#email").val()) {$("#RegistForm").submit();} else { //  如果没有值$("#notice").html("请填写完整信息");setTimeout(function() {$("#notice").hide();}, 1000);}});});
</script>
</head>
<body><div class="container"><div id="register"><form class="form-horizontal" id="RegistForm" method="post"action="${pageContext.request.contextPath}/RegistServlet"><fieldset><div id="legend" class=""><legend class="">用户注册</legend></div><div class="form-group"><!-- Text input--><label class="col-sm-2 control-label">账号</label><div class="col-sm-5"><input type="text" placeholder="请输入6位数账号..." class="form-control"required name="username"></div></div><div class="form-group"><label class="col-sm-2 control-label">密码</label><div class="col-sm-5"><input type="password" placeholder="请输入6位数密码..." requiredclass="form-control" name="password"></div></div><div class="form-group"><label class="col-sm-2 control-label">邮箱</label><div class="col-sm-5"><input type="email" placeholder="请填写邮箱地址..." class="form-control"id="email" name="email" required></div></div><div class="form-group"><label class="col-sm-2 control-label">验证码</label><div class="col-sm-5"><input type="text" name="code" id="code" placeholder="请输入邮箱的验证码"class="form-control" required> <input type="button" name="btn"class="btn btn-default" id="btn" value="发送验证码" /></div></div><span id="notice" class="hide">请先完成邮箱验证</span><br /><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><a href="login.jsp" class="btn btn-success">返回登录</a> <inputclass="btn btn-info" type="submit" id="submit" value="邮箱注册" /></div></div></fieldset></form></div></div>
</body>
</html>

根据上面,我们点击发送验证码的时候,会请求:SendEmailServlet。

新建SendEmailServlet

于是新建一个SendEmailServlet.java:

package com.zout.controller;import java.io.IOException;
import java.util.Properties;import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.zout.util.JavaMailUtil;
import com.zout.util.RandomUtil;
import com.zout.util.htmlText;/*** *@class_name:SendEmailServlet*@comments:注册- 发送邮箱验证码功能*@param:*@return: *@author:邹涛/Zoutao*@createtime:2019年2月22日*/@WebServlet("/SendEmailServlet")
public class SendEmailServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("邮箱发送功能");try {String email = req.getParameter("email");JavaMailUtil.receiveMailAccount = email; // 给用户输入的邮箱发送邮件// 1、创建参数配置,用于连接邮箱服务器的参数配置Properties props = new Properties();// 开启debug调试props.setProperty("mail.debug", "true");// 发送服务器需要身份验证props.setProperty("mail.smtp.auth", "true");// 设置右键服务器的主机名props.setProperty("mail.host", JavaMailUtil.emailSMTPHost);// 发送邮件协议名称props.setProperty("mail.transport.protocol", "smtp");// 2、根据配置创建会话对象,用于和邮件服务器交互Session session = Session.getInstance(props);// 设置debug,可以查看详细的发送logsession.setDebug(true);// 3、创建一封邮件String code = RandomUtil.getRandom();System.out.println("邮箱验证码:" + code);String html = htmlText.html(code);MimeMessage message = JavaMailUtil.creatMimeMessage(session, JavaMailUtil.emailAccount,JavaMailUtil.receiveMailAccount, html);// 4、根据session获取邮件传输对象Transport transport = session.getTransport();// 5、使用邮箱账号和密码连接邮箱服务器emailAccount必须与message中的发件人邮箱一致,否则报错transport.connect(JavaMailUtil.emailAccount, JavaMailUtil.emailPassword);// 6、发送邮件,发送所有收件人地址transport.sendMessage(message, message.getAllRecipients());// 7、关闭连接transport.close();//  写入sessionreq.getSession().setAttribute("code", code);} catch (Exception e) {e.printStackTrace();req.getSession().setAttribute("error", "邮件发送失败");}}
}

需要用到servlet的jar包哟,你有tomcat就会自动导入进去。

当中用到三个工具类,新建工具类。

新建工具类JavaMailUtil

在com.zout.util包下新建

JavaMailUtil.java

package com.zout.util;import java.io.IOException;
import java.util.Date;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;/*** *@class_name:JavaMailUtil*@comments:定义邮箱发送配置接口*@param:web版本*@return: *@author:邹涛/Zoutao*@createtime:2019年2月23日*/
public class JavaMailUtil {// 发件人的邮箱-修改为自己的public static String emailAccount = "你自己的@qq.com";// 发件人邮箱授权码-修改为自己的public static String emailPassword = "prktbf你自己vbajj";// 发件人邮箱服务地址-修改为自己的public static String emailSMTPHost = "smtp.qq.com";//  收件人邮箱public static String receiveMailAccount = "";/***  创建一封邮件(发件人、收件人、邮件内容)* @param session* @param sendMail* @param receiveMail* @param html* @return* @throws MessagingException* @throws IOException * cc:抄送* Bcc:密送* To:发送*/public static  MimeMessage creatMimeMessage(Session session,String sendMail,String receiveMail,String html) throws MessagingException, IOException {// 1、创建一封邮件对象MimeMessage message = new MimeMessage(session);// 2、From:发件人message.setFrom(new InternetAddress(sendMail, "发件人昵称", "UTF-8"));// 3、To:收件人(可以增加多个收件人:抄送或者密送)message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "张三", "UTF-8"));// 4、Subject:邮件主题message.setSubject("邮箱验证","UTF-8");// 5、Content:邮件正文(可以使用Html标签)message.setContent(html,"text/html;charset=UTF-8");// 6、设置发送时间message.setSentDate(new Date());// 7、保存设置message.saveChanges();// 8、将该邮件保存在本地//OutputStream out = new FileOutputStream("D://MyEmail" + UUID.randomUUID().toString() + ".eml");//message.writeTo(out);//out.flush();//out.close();return message;} 
}

把对应地方改为你自己的。

新建RandomUtil工具类

在com.zout.util包下新建RandomUtil;

RandomUtil.java:

package com.zout.util;/*** *@class_name:RandomUtil*@comments:生成随机6位数验证码*@param:*@return: *@author:邹涛/Zoutao*@createtime:2019年2月23日*/
public class RandomUtil {public static void main(String[] args) {// 控制台打印System.out.println(RandomUtil.getRandom());}//  生成6位数随机验证码public static String getRandom() {String[] letters = new String[] {"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M","0","1","2","3","4","5","6","7","8","9"};String code ="";for (int i = 0; i < 6; i++) {code = code + letters[(int)Math.floor(Math.random()*letters.length)];}return code;}
}

新建内容htmlText类

在com.zout.util包下新建

htmlText.java:

package com.zout.util;/*** *@class_name:htmlText*@comments:定义邮件内容*@param:*@return: *@author:邹涛/Zoutao*@createtime:2019年2月23日*/
public class htmlText {//  返回页面Html携带的6位随机码public static String html(String code) {String html = "Email地址验证<br/>"+ "这封邮件是由【柒晓白网络科技】发送的。<br/>"+"你收到这封邮件是【柒晓白网络科技】进行新用户注册或者用户修改Email使用这个地址。<br/>"+"账号激活声明<br/>"+"请将下面的验证码输入到提示框即可:<h3 style='color:red;'>" + code + "</h3><br/>";return html;}}

这就完成了邮件发送的功能。

然后我们还需要注册接收的servlet。
因为在jsp当中,点击注册的时候,发请求:RegistServlet。
新建一个servlet类:
RegistServlet.java

package com.zout.controller;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** *@class_name:RegistServlet*@comments: 注册请求处理*@param:验证码校验 *@return: jsp跳转*@author:邹涛/Zoutao*@createtime:2019年2月22日*/
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet{private static final long serialVersionUID = 1L;@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 获取session中的验证码String sessionCode = (String) req.getSession().getAttribute("code");System.out.println(sessionCode);if(sessionCode != null) {//  获取页面提交的验证码String inputCode = req.getParameter("code");System.out.println("页面提交的验证码:" + inputCode);if (sessionCode.toLowerCase().equals(inputCode.toLowerCase())) {String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("页面提交:" + username+password);//  验证成功,跳转成功页面req.setAttribute("username", username);req.getRequestDispatcher("/success.jsp").forward(req, resp);}else {//  验证失败req.getRequestDispatcher("fail.jsp").forward(req, resp);}}else {//  验证失败req.getRequestDispatcher("fail.jsp").forward(req, resp);}//  移除session中的验证码req.removeAttribute("code");}
}

接收一下注册请求,然后跳转到指定页面。

好了整个邮箱注册已经完成。开始运行我们的项目了。

浏览器输入:http://localhost:8080/EmailAndPhone/register.jsp

邮箱发送效果图:

输入邮箱地址:

带有校验,如果邮箱不是带有@符号,则出现错误提示。

在这里插入图片描述
点击发送验证码。

后台:

在这里插入图片描述邮箱里面查看验证码:
在这里插入图片描述

输入错误的验证码就会提示错误,输入正确的就会跳转到成功页面。
在这里插入图片描述


好了,上诉就是整个关于最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能的过程了。

总结一下,其中需要导入对应的jar包(ali的json,java的email,activation-1.1.1.jar),boostrap的css,js,和juqery的js。这些都是网上可以下载的。你可以自己下载。

如图:
在这里插入图片描述

boostrap组件:

在这里插入图片描述

最后贴出整个项目的源码包下载地址:源码

没有积分,点个关注留下邮箱,我发给你。



http://chatgpt.dhexx.cn/article/JFtmS64Y.shtml

相关文章

uniapp中注册手机号短信验证码

一、效果图 二、输入手机号页面 <template><view><view classlogin-tel><view classtel-main><view classlogin-from><view classlogin-user><text classuser-text>手机号</text><input type"number" focustrue…

阿里云手机验证码注册(可以使用阿里云提供的测试模板,不用个人申请)

目录 打开阿里云&#xff1a;&#xff08;绑定手机号码&#xff09;&#xff0c;不用申请模板和签名手机验证码注册流程&#xff1a;实现流程创建springboot工程&#xff0c;添加依赖编写applicatioin配置文件编写controller&#xff0c;根据手机号发送短信编写service&#xf…

抖音实战~手机号验证码一键注册登录流程(限制手机终端登录)

文章目录 一、手机号验证码二、前端2.1. 点击登陆流程2.2. 点击登录源码 三、后端登录3.1. 登录流程图3.2. 流程简述3.3. 手机号验证码登录流程 一、手机号验证码 二、前端 2.1. 点击登陆流程 1.先校验手机号是否合法&#xff1f;不合法&#xff0c;则提示“请输入正确的手机…

会话——验证码注册与记住密码登录

文章目录 1、需求分析2、用户登录功能2.1、流程分析2.2、代码实现2.3、结果演示 3、登录记住密码功能3.1、流程分析3.2、代码实现3.3、结果演示 4、用户注册功能4.1、流程分析4.2、代码实现4.3、结果演示 5、注册验证码功能5.1、流程分析5.2、代码实现5.3、结果演示 1、需求分析…

关于烧写ESP8285核心板的相关事项

首先需要一个CH340的usb 转ttl 板子 然后连接到8285 脚管对应 TTL ---- 8285 VCC----VCC RXD----TX0 TXD----RX0 GND----GND 在通电之前先要把8285的GND 和io 0 连在ttl 板子的 GND上 烧写软件要设置正确否则无法启动

esp32 esp8285 wf6000OTA升级小记

近期做了3个IOT芯片的OTA升级&#xff0c;记录下&#xff1a; 最开始做完的是ESP32,升级流程也简单&#xff0c;初始烧录到固定区&#xff0c;然后OTA升级就会在user1,user2两个区内来回升&#xff0c;升级的文件是同一个&#xff08;即同一个文件&#xff0c;先升级就是user1…

Ubuntu18.04 上 ESP8285 的 esp-at release_v2.2.0.0 编译环境搭建

1 环境搭建前提 1.1 安装编译 ESP-IDF 需要的软件包&#xff1a; sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util1.2 安装 Python 3.8 sudo apt-get install python3.8-…

探索ESP8285(3)通过EMQX服务器点亮一个LED灯

CCC_122&#xff1a;博客只用于学习交流&#xff0c;不涉及任何商业用途&#xff0c;如果有错误之处&#xff0c;欢迎指正。 在上一个博客的基础上 探索ESP8285&#xff08;2&#xff09;搭建Windows版MQTT服务器 我们来通过EMQX服务器点亮ESP8285模块上的LED灯。 首先查得E…

乐鑫esp8266学习rtos3.0笔记第10篇:内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品;

本系列博客学习由非官方人员 半颗心脏 潜心所力所写&#xff0c;仅仅做个人技术交流分享&#xff0c;不做任何商业用途。如有不对之处&#xff0c;请留言&#xff0c;本人及时更改。 1、 Esp8266之 搭建开发环境&#xff0c;开始一个“hellow world”串口打印。 2、 Esp8266之…

晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) ESP8285/ESP8266芯片案例

【应用】国产26MHz频率晶振应用于物联网WIFI物联网模块&#xff08;串口转WiFi模块&#xff09;&#xff0c;Espressif(乐鑫) ESP8285/ESP8266芯片匹配测试OK ESP8285其实是ESP8266的升级版本&#xff0c;两者可以共用同一套SDK&#xff0c;只是ESP8285内部集成了1MB Flash&…

ESP8285烧写问题备忘

1 问题现象 ESP8285 烧写了固件&#xff0c;怎么都跑不起来&#xff0c;串口打印如下信息&#xff1a; ets Jan 8 2013,rst cause:2, boot mode:(3,7)load 0x4010f000, len 1384, room 16 tail 8 chksum 0xef csum 0xef csum err ets_main.c 2 问题原因 上乐鑫官网查了 ESP…

ESP8285 多个bin文件合并烧录

可通过两种方式烧录固件&#xff0c;一种是基于esp-idf开发时&#xff0c;中命令终端执行make flash命令烧录&#xff1b;二是使用ESPFlashDownloadTool工具。 bin文件说明 ESP8285/ESP8266的固件一般包含4个bin文件。 查看各bin文件的路径 以带OTA的固件为例&#xff0c;在…

ESP8285+WS2812+MAX9814制作的音乐律动氛围灯

该项目主要参考了立创EDA开源广场的项目&#xff1a; esp8285芯片ESP-01F模块为主控&#xff0c;MAX9814音频采集模块&#xff0c;WS2812 2020rgb灯珠&#xff0c;Arduino编程环境简单制作一个律动灯条。 因为正在学习硬件PCB&#xff0c;所以只能算是一个仿照。 硬件&#x…

探索ESP8285(2)搭建Windows版MQTT服务器

CCC_122&#xff1a;博客只用于学习交流&#xff0c;不涉及任何商业用途&#xff0c;如果有错误之处&#xff0c;欢迎指正。 MQTT服务器有多个选择&#xff0c;例如EMQX&#xff0c;Mosquitto&#xff0c;Apollo&#xff0c;以下我们选择比较简单的EMQX来搭建MQTT的服务器。 一…

峥果智能连接不到服务器,峥果浴霸 ESP8285版本 固件

ESP ZINGUO 峥果智能浴霸个人固件. 作者声明 注意: 本项目主要目的为作者本人自己学习及使用峥果智能浴霸而开发&#xff0c;本着开源精神及造福网友而开源&#xff0c;仅个人开发&#xff0c;可能无法做到完整的测试&#xff0c;所以不承担他人使用本项目照成的所有后果。 严禁…

ESP8266 简单研究 ESP8285 研究

网址&#xff1a; http://wiki.ai-thinker.com/esp8266 ESP8266 系列模组专题 概述 ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266的超低功耗的UART-WiFi模块的模组&#xff0c;可以方便地进行二次开发&#xff0c;接入云端服务&#xff0c;实现…

基于RK3399ESP8285自动售货柜项目—MP08开发板端代码详解

基于RK3399&ESP8285自动售货柜项目—②MP08开发板端代码详解 本系列文章将详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法&#xff0c;从硬件连接到网络通信再到软件实现&#xff0c;本产品所用开发板为RK3399以及MP08_2019/11/03 , 如有疑问与见解&#xff0c;可…

ESP8285 ESP-AT编译流程和操作步骤

ESP8282ESP-AT编译流程和操作步骤 ESP8285 相当于ESP8266EX 1M SPI Flash ,他的编译工具和ESP-AT 都是跟ESP8266EX 一样的. 他的AT指令不能做OTA分区. 由于flash空间原因. 个人理解 配置好 esp8285 的编译工具链 setup-toolchain export PATH"$PATH:$HOME/xtensa-lx1…

Sipeed M1W内部esp8285固件烧录教程

Sipeed 的K210是真的香啊&#xff0c;但是内部的这个esp8285是做的真的不咋地。买回来之后这个8285折腾死我了&#xff0c;好几次固件出问题&#xff0c;掉固件&#xff0c;问了客户姐姐和群主“泽畔”大佬才解决&#xff0c;所以总结下。 下载固件&#xff1a; 首先我们需要先…

ESP8266与ESP8285开发时有什么区别

ESP8266与ESP8285开发时有什么区别 ESP8266与ESP8285开发时有什么区别烧录环节的改变编译前Makefile文件的更改 ESP8266与ESP8285开发时有什么区别 ESP8266模块在WiFi联网领域已经被广泛使用&#xff0c;但是ESP8266芯片是需要外挂Flash芯片的&#xff0c;这样就使模块不能做的…