基于jsp和基于web的区别_java发送短信

2022-11-04 16:17:58 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

最新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 "&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:

代码语言: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

0 人点赞