java注册界面发送邮箱验证码(无线程版)

news/2024/5/19 18:13:55/文章来源:https://blog.csdn.net/weixin_44718317/article/details/127566090

邮箱验证注册

本篇文章使用第三方jar包实现邮箱发送验证码来注册用户,该文章未采用线程如果多人访问注册注册页面发送邮件可能会导致服务器崩溃,建议采用线程发送邮件!!!

一、前期准备工作

1.发送验证码所需要用到的邮箱设置(以qq邮箱为例)

1)点击设置
在这里插入图片描述
​​​ 2)点击账户
在这里插入图片描述
3) 找到POP3/SMTP和IMAP/STMP服务并打开(可能需要手机验证),会生成授权码,你需要记住你自己的授权码。(本次需要用到IMAP/STMP服务) 在这里插入图片描述

2.导入email的三方jar包

本次采用maven骨架的方式导包

<!-- 邮箱jar包-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.2</version>
</dependency>

3.数据库设计

create table admin(id INT NOT NULL PRIMARY KEY auto_increment,admin_name varchar(20) null,password varchar(255) null
);

二、具体实现步骤

1.用户的pojo层
2.mysql数据库mybatis配置
3.mapper接口
4.返回前端结果集封装到ResultModel
5.发送邮件的工具类
6.发送邮件的servlet层
7.注册的servlet层
8.前端页面编写,采用layui框架

1.用户的pojo层

public class Admin {private long id;private String adminName;private String password;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getAdminName() {return adminName;}public void setAdminName(String adminName) {this.adminName = adminName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

2.mysql数据库mybatis配置,获取sqlsession工厂需要去自己配置(不会的话可私聊我)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 设置pojo层别名  (xxxMapper.xml配置结果集返回的pojo层的名称),不区分大小写 --><typeAliases><package name="com.mxheale.pojo"/></typeAliases><!--environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库连接信息--><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///自己的数据库?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/><property name="#{username}" value="#{username}"/><property name="#{password}" value="#{password}"/></dataSource></environment></environments>
</configuration>

3.mapper接口(本次使用的sql语句比较简单所以我们采用注解来写sql)

public interface AdminMapper {//添加用户@Insert("insert into admin (admin_name,password) values (#{adminName},#{password});")int register(@Param("adminName") String adminName, @Param("password") String password);//查询用户名是否存在@Select("select admin_name as adminName,password from admin where admin_name = #{adminName};")Admin selectByName(String adminName);
}

4.返回前端结果集

public class ResultModel {//编码:0表示成功 1表示失败private Integer code;//返回的信息数据private String msg;//影响的条数private Integer count;//查询出的数据private Object data;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Integer getCount() {return count;}public void setCount(Integer count) {this.count = count;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}/*根据sql影响条数得到结果
* */public static ResultModel getResultModel(int count) {return getCommonResultModel(count, count > 0 ? 0 : 1, count > 0 ? "success" : "error", null);}public static ResultModel getResultModel(String msg){return getCommonResultModel(0, 0, msg, null);}public static ResultModel getResultModel(String msg,int code){return getCommonResultModel(0, code, msg, null);}private static ResultModel getCommonResultModel(int count, int code, String msg, Object data) {ResultModel resultModel = new ResultModel();resultModel.setMsg(msg);resultModel.setCode(code);resultModel.setCount(count);resultModel.setData(data);return resultModel;}
}

5.发送邮件的工具类

public class SendEmail {private static Integer code;//生成验证码,并返回给前端控制层,用于判断验证码是否正确public static Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public static int sendEmail(String emailAddress) {Random random = new Random();SendEmail sendEmail = new SendEmail();sendEmail.setCode(random.nextInt(9000)+1000);//生成四位验证码HtmlEmail email = new HtmlEmail();//创建email对象email.setHostName("smtp.qq.com");//发送邮箱的邮箱类型,126邮箱为smtp.126.com,163邮箱为163.smtp.com,qq邮箱为smtp.qq.comemail.setCharset("UTF-8");//设置编码格式try {email.addTo(emailAddress);// 收件地址email.setFrom("发送邮箱的地址", "发送邮箱的用户名");// 设置邮箱地址和用户名,用户名可以任意填写//jbbb********baee(IMAP/SMTP服务)---这里需要改为你自己email.setAuthentication("发送邮箱的地址", "jbbb********baee");// 设置邮箱地址和授权码email.setSubject("邮件标题");// 设置邮件标题email.setMsg("【xxx注册验证】验证码为" + getCode());// 此处填写邮件内容email.send();return getCode();} catch (EmailException e) {return 0;}}
}

6.发送邮件的servlet层

@WebServlet("/register/sendEmail")
public class SendEmailServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)  throws ServletException, IOException {//乱码处理req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");//获取前端的emilString email = req.getParameter("email");int flag = 0;ResultModel result = null;if (email != null&& !"".equals(email)) {//判断邮箱不为空和nullint code = SendEmail.sendEmail(email);//邮箱不为空和null后发送验证码if (code != 0) {flag = 1;//标志位,用于判断发送是否成功}}else {result =  ResultModel.getResultModel("邮箱格式不正确!");}ResultModel resultModel = ResultModel.getResultModel(sendResult,flag);resp.getWriter().println(JSONObject.toJSONString(result));}

7.注册的servlet层(这里用到sqlsession工厂,调用自己的工厂类)

@WebServlet("/register/ad_register")
public class AdminRegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.处理乱码req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");//2.获取前端的数据String username = req.getParameter("username");String password = req.getParameter("password");String rePassword = req.getParameter("rePassword");String inputCode = req.getParameter("code");Admin ad = new Admin();ad.setPassword(Tool.nullToString(password));//自己写的工具类,用于将前端的null转换为空字符串,可以不写(最多导致数据库存null)ad.setAdminName(Tool.nullToString(username));//获取sql连接SqlSessionFactory sqlSessionFactory = Tool.getSqlSessionFactory();//调用自己写的sqlsession工厂工具类,可以自己调用mybatis配置文件和新建工厂SqlSession sqlSession = sqlSessionFactory.openSession();//调用mappr代理AdminMapper adminMapper = sqlSession.getMapper(AdminMapper.class);Admin admin = adminMapper.selectByName(username);//查询是否重名ResultModel result = null;//创建发送邮箱的对象,获取验证码int code = SendEmail.getCode();//判断是否重名if (admin != null) {result = ResultModel.getResultModel("你输入的用户名已存在,请重新输入!");} else {if (Integer.parseInt(inputCode) == code) {if (password.equals(rePassword)) {//得到查询结果result = ResultModel.getResultModel(adminMapper.register(username, password));} else {result = ResultModel.getResultModel("两次输入的密码要相同!");}} else {result = ResultModel.getResultModel("验证码输入错误");}}//将结果发送到页面resp.getWriter().println(JSONObject.toJSONString(result));sqlSession.commit();sqlSession.close();}
}

8.前端页面编写,采用layui框架

<!doctype html>
<html class="x-admin-sm">
<head><meta charset="UTF-8"><title>注册</title><!--下面都是layui框架的配置,需要自己下载layui框架--><meta name="renderer" content="webkit|ie-comp|ie-stand"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport"content="width=device-width,user-scalable=yes, minimum-scale=0.4, initial-scale=0.8,target-densitydpi=low-dpi"/><meta http-equiv="Cache-Control" content="no-siteapp"/><link rel="stylesheet" href="/X-admin/css/font.css"><link rel="stylesheet" href="/X-admin/css/login.css"><link rel="stylesheet" href="/X-admin/css/xadmin.css"><script src="/X-admin/lib/layui/layui.js" charset="utf-8"></script><!--自己的jquery--><script src = "../js/jquery.js"></script><!--自己配置ajax的js--><script src = "/js/myAjax.js"></script></head>
<body class="login-bg"><div class="login layui-anim layui-anim-up"><div class="message">用户注册</div><div id="darkbannerwrap"></div><form method="post" class="layui-form"><input name="username" placeholder="用户名" type="text" lay-verify="username" class="layui-input"><hr class="hr15"><input name="password" lay-verify="password" placeholder="密码" type="password" class="layui-input"><hr class="hr15"><input name="rePassword" lay-verify="rePassword" placeholder="确认密码" type="password" class="layui-input"><hr class="hr15"><input name="email" lay-verify="email" placeholder="邮箱" type="email" class="layui-input"><hr class="hr15"><input name="code" lay-verify="code" placeholder="邮箱验证码" type="number" class="layui-input"><hr class="hr15"><input value="发送" lay-submit lay-filter ="send" style="width:60%;" type="submit"><input value="注册" lay-submit lay-filter="register" style="width:100%;" type="submit"><hr class="hr20"></form>
</div></body>
<script>layui.use('form', function () {let form = layui.form;form.on('submit(send)',function (data){data = data.field;//自己的配置的myAjax函数let res = myAjax("/register/sendEmail", data,'post');if(res.code > 0){alert("邮箱发送成功,请注意查收!");}else{alert("邮箱发送失败,请检查邮箱格式是否正确!");}return false;});form.on('submit(register)', function (data) {data = data.field;console.log(data);let res = myAjax("/register/ad_register",data,'post')if(res.count > 0){layer.alert("注册成功", {icon: 6},function () {//关闭当前framexadmin.close();// 可以对父窗口进行刷新xadmin.father_reload();});}else{alert(res.msg);}return false;})})
</script>
</html>

总结

邮件发送,只用到一个三方邮箱jar包,相对来说较简单,实现的逻辑并不难;需要注意的是:核对自己的授权码和邮箱地址一定要对应。新人第一次写文,如有不足之处,还请多多指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_88883.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

MinGW-w64安装教程——著名C/C编译器GCC的Windows版本 MinGW-w64安装教程——著名C/C编译器GCC的Windows版本 本文主要讲述如何安装 C语言 编译器——MinGW-w64&#xff0c;特点是文章附有完整详细的实际安装过程截图&#xff0c;文字反而起说明提示作用。 编写本文的原因始于…

计算机三级数据库技术

第一章 数据库应用系统开发方法 数据库应用系统生命周期 软件工程与软件开发方法 瀑布模型 快速原型模型 螺旋模型 DBAS生命周期 DBAS生命周期&#xff1a;项目规划、需求分析、系统设计、实现与部署、运行与维护 规划与分析 可行性分析&#xff1a;经济可行性、技术可行性、操…

NoSQL之redis配置

目录 关系数据库与非关系数据库 关系数据库与非关系数据库概念 关系型数据库和非关系型数据库区别 关系型数据库与非关系型数据库特点 字段保存方式 Redis Redis 优点 Redis为什么这么快&#xff1f; redis安装部署 redis工具 redis 命令工具 redis-cli 命令行工具 …

Mybatis中如何实现一对一,一对多的关联查询?

MyBatis实现一对一、一对多关联查询一般有两种方式&#xff1a; 方式一&#xff1a;sqlMapper配置文件 一对一&#xff1a;在resultMap标签中使用 association 标签 一对多&#xff1a;在resultMap 标签中使用collection 标签 方式二&#xff1a;注解 一对一&#xff1a;在…

MySQL使用简单教程

本文通过演示如何使用MySQL客户机程序创建和使用一个简单的数据库&#xff0c;允许连接到MySQL服务器、运行查询和查看结果。 mysql也可以在批处理模式下使用&#xff1a;预先将查询放在文件中&#xff0c;然后告诉mysql执行文件的内容。 要查看mysql提供的选项列表&#xff0c…

解决MySQL插入不了中文数据问题

&#x1f388;目录&#x1f388; 原因⁉ 具体解决方法 1️⃣创建数据库时设置字符集为utf8 2️⃣修改数据库配置文件&#xff08;比较麻烦&#xff09; 我们使用MySQL可能会遇到加入中文报错的情况&#xff0c;如下。 报错&#xff1a;非法的字符值 放入 ‘name’ 为什么…

MySQL 复制架构

MySQL 复制架构 第一节 概述 1.1 数据拓展 热备份&#xff1a;数据库在运行的过程中&#xff0c;对数据进行备份操作。相对的&#xff0c;还有冷备份&#xff0c;冷备份需要停机&#xff0c;然后对数据进行备份操作。多活&#xff1a;所谓的多活&#xff0c;就是让数据库机器…

习惯了微信聊天,利用WebSocket手动实现个聊天功能怎么样?

1.背景 基于项目需求&#xff0c;最近需要实现一个简单的聊天功能。日常生活中&#xff0c;大家对于聊天也习以为常&#xff0c;微信、QQ等软件也经常用到&#xff0c;其实我们也可以引入一些第三方的sdk包等去实现&#xff0c;也可以利用WebSocket通信协议去手动实现简单的聊…

【蓝桥杯】第十三届蓝桥杯省赛 AK 攻略 —— C++ B组全真题超详细剖析

&#x1f384;目录&#x1f33c;写在前面&#x1f33b; A题 --- 九进制转十进制&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; B题 --- 顺子日期&#x1f337; 题目描述&#x1f337; 解题思路&#x1f337; 代码编写&#x1f33b; C题 --…

92年程序员发帖晒薪资称自己很迷茫,网友:老弟你可以了

当下&#xff0c;是一个“向钱看&#xff0c;向厚赚”的社会。快节奏的生活下&#xff0c;家庭、工作各方面压力很容易使年轻人陷入迷茫和焦虑。 与其他行业相比&#xff0c;程序员的高薪让人羡慕。那么&#xff0c;对于那些真正达到这么多收入的人来说&#xff0c;他们是怎么…

Mysql安装包安装教程(亲测简单高效版)

Mysql安装包安装教程&#xff08;亲测简单高效版&#xff09;安装流程mysql安装SQLyog安装安装流程 mysql安装 1.下载mysql&#xff0c;官方地址&#xff1a;mysql官网 2.解压mysql安装包到任意目录下 3.新建my.ini文件 4.配置my.ini [mysqld] basedirD:\Program Files\J…

sql语法:详解DDL

Mysql版本&#xff1a;8.0.26 可视化客户端&#xff1a;sql yog 目录一、DDL是什么&#xff1f;二、和数据库相关的DDL2.1 创建数据库2.2 删除数据库2.3 查看所有的数据库&#xff0c;当前用户登录后&#xff0c;可以看到哪些数据库2.4 查看某个数据库的详细定义2.5 修改数据库…

Windows系统GIT安装与GitHub远程仓库

文章目录Windows系统GIT安装Git是什么windows环境安装环境变量验证安装GitHub与远程仓库GitHub是什么GitHub账号注册创建本地SSH KeyGitHub接入本地电脑公匙创建个人远程库传送门Windows系统GIT安装 Git是什么 Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本…

接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)

目录 一、Postman背景介绍 二、Postman的操作环境 三、Postman重要提示&#xff1a; 四、什么是接口测试 五、接口测试工具 六、接口测试流程 七、接口测试执行 八、全局变量和环境变量 九、postman接口关联 十、postman动态参数 十一、postman断言 十二、postman用…

Unity --- Transform类

1.一个很有意思的事实是Transform类不仅用来管理游戏物体的位置缩放旋转&#xff0c;还用来管理游戏物体的父物体与子物体之间的关系 当游戏物体A的trasnform类a是游戏物体B的transform类b的父类的话&#xff0c;游戏物体A就是游戏物体B的父物体 2.如何访问脚本当前挂载的游戏…

手把手教你安装VSCode(附带图解步骤)

一、前端工具vscode 1.1、概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程&#xff0c;通过HTML&#xff0c;CSS及JavaScript以及衍生出来的各种技术、框架、解决方案&#xff0c;来实现互联网产品的用户界面交互 [1] 。它从网页制作演变而来&#xff0c;名称上有…

如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

前言 最近调研了一下我做的项目受欢迎程度&#xff0c;大数据分析方向竟然排第一&#xff0c;尤其是这两年受疫情影响&#xff0c;大家都非常担心自家公司裁员或倒闭&#xff0c;都想着有没有其他副业搞搞或者炒炒股、投资点理财产品&#xff0c;未雨绸缪&#xff0c;所以不少…

你单位数字化转型了吗?

写在前面&#xff1a;本文由Bing AI和我一起完成&#xff0c;它完成90%内容&#xff0c;致谢&#xff01; 1.数字化转型 近两年数字化转型在社会面搞得轰轰烈烈&#xff0c;数字化转型是指&#xff0c;利用新一代信息技术&#xff0c;构建数据的采集、传输、存储、处理和反馈的…

抓取某话题下指定时间内的微博数据,包括博文数据、评论信息等(可通过高级搜索筛选时间)

代码有点长&#xff0c;完整代码放在文章最后了。 最后的数据存储为了3个表&#xff0c;表的各字段如下&#xff1a; # csv头部 writer.writerow((话题链接, 话题内容, 楼主ID, 楼主昵称, 楼主性别, 发布日期,发布时间, 转发量, 评论量, 点赞量, 评论者ID, 评论者昵称,评论者…

低代码开发公司:用科技强力开启产业分工新时代!

实现办公自动化&#xff0c;是不少企业的共同追求。低代码开发公司会遵循时代发展规律&#xff0c;注入强劲的科技新生力量&#xff0c;在低代码开发市场厚积爆发、努力奋斗&#xff0c;推动企业数字化转型升级&#xff0c;为每一个企业的办公自动化升级创新贡献应有的力量。 一…