大家好,又见面了,我是你们的朋友全栈君。
最新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:
源码:
代码语言:javascript复制<%@ 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> <input class="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:
代码语言:javascript复制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;
@Override
public 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:
源码:
代码语言:javascript复制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: 源码:
代码语言:javascript复制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 源码:
代码语言:javascript复制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 "×tamp=" 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:
代码语言:javascript复制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);
// 创建session
Session session = Session.getInstance(prop);
// 通过session得到transport对象
Transport ts = session.getTransport();
// 连接邮件服务器:邮箱类型,帐号,POP3/SMTP协议授权码 163使用:smtp.163.com
ts.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:
代码语言:javascript复制<%@ 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位数密码..." required class="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> <input class="btn btn-info" type="submit" id="submit" value="邮箱注册" />
</div>
</div>
</fieldset>
</form>
</div>
</div>
</body>
</html>
根据上面,我们点击发送验证码的时候,会请求:SendEmailServlet。
新建SendEmailServlet
于是新建一个SendEmailServlet.java:
代码语言:javascript复制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;
@Override
protected 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,可以查看详细的发送log
session.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();
// 写入session
req.getSession().setAttribute("code", code);
} catch (Exception e) {
e.printStackTrace();
req.getSession().setAttribute("error", "邮件发送失败");
}
}
}
需要用到servlet的jar包哟,你有tomcat就会自动导入进去。
当中用到三个工具类,新建工具类。
新建工具类JavaMailUtil
在com.zout.util包下新建
JavaMailUtil.java
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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
代码语言:javascript复制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;
@Override
protected 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组件:
最后贴出整个项目的源码包下载地址:源码
没有积分,点个关注留下邮箱,我发给你。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182509.html原文链接:https://javaforall.cn