最新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组件:

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

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


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

  1. 最新web/java/jsp实现发送手机短信验证码的注册登录功能(秒嘀科技)

    先来bb点废话,菜鸡本菜这两天在弄毕业设计,正好老师要求做手机号短信验证登录,自己也是上网搜的教程,但有几个地方值得记录一下. 网上大部分用的maven和idea来做,而我自己本身项目用的eclips ...

  2. Java 后台实现 发送手机短信的功能(中国网建)

    Java 后台实现 发送手机短信的功能(中国网建) 效果截图: 一.准备阶段 (1)准备第三方平台: 发送短信肯定是需要第三方平台,并且是收费的. 本篇以[中国网建]提供的 SMS 短信平台实现,该平 ...

  3. java之网站发送手机短信实现

    在一些网站上需要实现给用户手机发送短信,看起来似乎很难实现,其实不然,表面复杂的技术,当你弄明白原理之后就变成了不是问题的问题......不多说,直接看代码 1.原理:给用户发送短信主要是通过移动提供 ...

  4. 利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  5. java实现语音发送,Java实现发送手机短信语音验证功能代码实例

    这篇文章主要介绍了java实现发送手机短信语音验证功能代码实例,www.cppcns.com文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 利用第三方 ...

  6. java 发送短信例子_利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

  7. JAVA发送手机短信,httpclient短信发送接口示例(java)

    httpclient短信发送接口示例(java),可用于直接用电脑发送短信,可根据实际情况,与联通移动公司洽谈接口,完成网上发送短信功能,如需jar包,可向联通移动公司项目部沟通. package c ...

  8. java实现的一个发送手机短信

    利用java实现的一个发送手机短信的小例子 JAVA发送手机短信,流传有几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注 ...

  9. java 短信_java实现发送手机短信

    本文主要研究了JAVA语言发送手机,分享给大家,供大家参考,具体内容如下 JAVA发送手机短信,流传有几种方法: (1)使用webservice接口发送手机短信,这个可以使用sina提供的webser ...

  10. Java发送手机短信

    一.需求 通过MAS: 移动代理服务器,向用户发送手机短信. 由移动提供WebService接口,在代码中调用该接口即可. 二.实现代码 package com.wbf.test;import jav ...

最新文章

  1. 在python中等号前面与后面分别是什么意思-Python中冒号等于(:=)是什么意思?...
  2. Robust 源代码分析之gradle-plugin
  3. mybati内sql查询语句在两个日期内
  4. [渝粤教育] 中国地质大学 Windows程序设计 复习题 (2)
  5. Selenium备忘手册 [转]
  6. 显示照片的二维直方图
  7. linux如何调试脚本文件目录,如何在Linux下调试Bash Shell脚本的方法
  8. python算法-冒泡排序
  9. 业务中台如何提升研发效率
  10. 什么软件测试出来的网速准确,百度应用的网速测试工具最不准确
  11. JS打开新窗口并居中显示
  12. 基于Spring Boot旅游打卡小程序系统的设计与实现【Java毕业设计·安装调试·代码讲解·文档报告】
  13. 第六章 现在给我道歉还来得及~修改登录cookie进后台上传muma
  14. linux mono安装,Linux下Nginx + mono安装与配置
  15. 强制关闭计算机窗口,windows系统怎么取消关机时强制关闭程序提示窗口?
  16. 移动端字体显示大小和css设置大小的不一致解决方案
  17. 题目 1867: 王牌花色
  18. 学计算机要买什么笔记本,学计算机的买什么笔记本
  19. 并发编程系列之AQS实现原理
  20. MD编辑器就是不告诉你之表情

热门文章

  1. 怎么把ppt弄成链接的形式_ppt链接excle表格:如何在ppt中超级链接到指定的excel工作表...
  2. 小米笔记本13.3(Intel+mx150独显双显卡)+deepin15.5+cuda9.0安装教程
  3. yum源及常用安装包整理
  4. 大学生活这样过,校招 offer 飞来找
  5. python正则表达式提取字符串中的书名_使用python正则表达式从字符串中提取名称...
  6. 三子棋编程题(上)--跟着鹏哥,学习C语言打卡第三天!!
  7. 哪些方面的纠纷可以去北京互联网法院提起诉讼?
  8. 用计算机写作文教学反思,语文作文教学反思(精选6篇)
  9. 在线逻辑分析仪的使用
  10. amos看拟合度在哪里看_Amos软件完结篇!模型无法拟合,拟合指标不佳如何解决?...