javaweb实现用户注册邮件验证功能
首先我们先准备运行环境
这里我用的是idea+1.8+tomcat9+maven3.6.3
首先确认实现邮件发送功能所需要的jar包 mail包 也就是支持邮件发送的网络编程的核心包
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
在idea中创建一个webapp项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SbWXPTmG-1610087727136)(C:\Users\hu\AppData\Roaming\Typora\typora-user-images\1610080152084.png)]
创建将依赖的jar导入 配置在maven中
首先我们需要先实现前端页面 这里 我写的比较简陋 方便测试
这里用的jsp页面不做重点讲解
<%--
Created by IntelliJ IDEA.
User: hu
Date: 2021/1/4
Time: 16:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" id="viewport" name="viewport">
<title></title>
<script src="statics/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
var countdown = 60;
function settime(obj) {
var path = $("#path").val();
var emi = $("#email").val();
console.log(emi);
if (emi.substr(emi.indexOf("@") + 1) == "qq.com") {
console.log(path+"/registered");
$("#span01").html("");
$.ajax({
type:"POST",
url:path+"/registered",
data:{email:$("#email").val()},
dataType:"json",
error:function(data){//当访问时候,404,500 等非200的错误状态码
$("#span01").html("!!错误!!");
}
})
var a = setInterval(function(){
if (countdown == 0) {
obj.removeAttribute("disabled");
obj.value = "免费获取验证码";
countdown = 60;
clearInterval(a);
return;
} else {
obj.setAttribute("disabled", true);
obj.value = "重新发送(" + countdown + ")";
countdown--;
}
},1000)
} else {
$("#span01").html("邮箱格式错误 必须以@qq.com结尾");
return;
}
}
</script>
<body>
<form action="${pageContext.request.contextPath}/submit">
<label for="email">QQ邮箱 :</label>
<input type="email" id="email" value="" />
<input type="button" id="btn" value="免费获取验证码" οnclick="settime(this)" />
<br>
<span id="span01" style="color: red;"></span>
<br />
<label for="rcode">验证码 :</label>
<input type="text" id="rcode" name="rcode" value="" />
<input type="submit" />
<input type="reset" />
<input id="path" type="hidden" name="path" value="${pageContext.request.contextPath }"/>
</form>
</body>
</html>
这里是使用的button 的点击事件发送一个ajax 异步请求 (先判断再发送,防止重复提交)
使用java mail 发送邮件的五个步骤
首先我们创建一个util类
public static String giveRcode(String email) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");
//设置qq邮件服务器
prop.setProperty("mail.transport.protocol","smtp");
//邮件发送协议
prop.setProperty("mail.smtp.auth","true");
//需要验证密码
//关于qq邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用java mail 发送邮件的五个步骤
//1.创建定义整个应用程序所需要的环境信息的session 对象
// qq才有!
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人的邮件用户名、授权码
return new PasswordAuthentication("1224558369@qq.com", "ywhkhaxavoelhiag");
}
});
//开启debug
session.setDebug(true);
//2.通过session得到transport 对象
Transport ts = session.getTransport();
//3.通过邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","1224558369@qq.com","ywhkhaxavoelhiag");
//4.创建邮件:
MimeMessage message = new MimeMessage(session);
//指明发件人
message.setFrom(new InternetAddress("1224558369@qq.com"));
//指明邮件的收件人,现在的发件人和收件人一样,= 给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress(email));
//邮件主题
message.setSubject("www.huyuya.com注册验证码");
String rcode = UUID.randomUUID().toString();
//邮件内容
message.setContent("您好验证码是:"+rcode,"text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
return rcode;
}
这里需要提的是 用户名和授权码 要时候qq发送邮件 必须使用 qq邮箱+授权码的形式发送
这里我带大家查找自己所对应的授权码
登录qq打开 qq邮箱
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zb19xOqo-1610087727139)(C:\Users\hu\AppData\Roaming\Typora\typora-user-images\1610084138677.png)]
打开这个设置 点击账号
往下翻
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hmMsZDTk-1610087727140)(C:\Users\hu\AppData\Roaming\Typora\typora-user-images\1610084177256.png)]
打开这 pop3/smtp 服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sVtkfKXc-1610087727142)(C:\Users\hu\AppData\Roaming\Typora\typora-user-images\1610084213922.png)]
这里要验证手机号 或者 验证密保 生成一个授权码 ywhkhaxavoelhiag 类似这种
这里我将发送邮件封装成一个方法进行调用 发送的验证码封装成一个返回值 用于验证
这里就将 邮件验证码 功能实现了 接下来就是验证 以及 验证码的存储
Servlet实现发送 和 验证验证码
ajax异步发送请求的Servlet
package com.huyuya.servlet;
import com.huyuya.utils.EmailUtil;
import com.mysql.jdbc.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author huyu
* @version 1.0
* @date 2021/1/4 16:28
*/
public class RegisteredServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String email = req.getParameter("email");
// 得到 前端发送过来的 email
System.out.println(email);
if (!StringUtils.isNullOrEmpty(email)) {
// 使用 StringUtil 防止空指针
String s = null;
try {
s = EmailUtil.giveRcode(email);
//用一个值接收发送出去的 验证码
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("前端:" + s);
HttpSession session = req.getSession();
session.setMaxInactiveInterval(60000);
//这里使用session最好 , 因为session 可以自定义销毁时间 单位为毫秒 这里是60秒
session.setAttribute("rcode", s);
//将改值保存在session 中
System.out.println(session.getAttribute("rcode"));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
当用户收到验证码时 提交 时 发送请求 用另一个 servlet 接收处理请求
package com.huyuya.servlet;
import com.mysql.jdbc.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author huyu
* @version 1.0
* @date 2021/1/7 9:50
*/
public class SubmitServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String rcode = req.getParameter("rcode");
//得到前端 的 验证码 rcode
System.out.println("后端"+rcode);
HttpSession session = req.getSession();
String rocdes = (String)session.getAttribute("rcode");
System.out.println("session:"+rocdes);
if(!StringUtils.isNullOrEmpty(rcode)){
System.out.println("进来没");
if(rcode.equals(req.getSession().getAttribute("rcode"))){
// 从session中取值 进行 判断
resp.sendRedirect("/r/success.jsp");
}else {
resp.sendRedirect("/r/index.jsp");
}
}else {
resp.sendRedirect("/r/index.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
direct("/r/index.jsp");
}
}else {
resp.sendRedirect("/r/index.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
然后 大家可以去动手 实践了!!