前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于jsp和基于web的区别_java发送短信

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

作者头像
全栈程序员站长
发布2022-11-04 16:17:58
4.1K0
发布2022-11-04 16:17:58
举报
文章被收录于专栏:全栈程序员必看

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

最新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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)
    • 一、手机验证码
      • 1.1、API申请
      • 1.2、在配置管理中新建一个模板
      • 1.3、自定义短信就要认证
      • 1.4、编写java手机短信发送代码
      • 新建login.jsp:
      • 新建servlet类:
      • 新建GetMessageCode.java:
      • 新建Config配置类
      • 新建HttpUtil请求类
      • 手机验证码发送效果图:
    • 二、邮箱验证码
      • 2.1、开启POP3/SMTP协议
      • 2.2、java版发送邮件:
      • 2.3、web版邮箱发送
  • 效果图:
  • 最后贴出整个项目的源码包下载地址:源码
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档