spring项目使用邮箱验证码校验

news2024/12/29 8:13:15

本项目采用免费QQ邮箱验证码方式进行登录安全的校验。

前期工作

申请邮箱安全授权码

打开QQ邮箱官网点击设置

进入设置页面后点击账户按钮

 进入账户后一直往下拉页面找到POP3服务栏,然后点击管理服务(如果没有开启服务需要先开启服务,按照邮箱提示操作即可)

进入管理服务页面后如果没有授权码,点击生成授权码,如果有即可进入授权码管理页面查看。

授权码过一段时间会自动过期,需要重新申请。

 

项目中导入邮箱依赖

复制以下maven坐标到项目中,maven会自动导入其他依赖的坐标

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

定义配置类

完整代码如下,有注解,我将需要修改的地方单独列在后面

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
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;
import java.util.Properties;
import java.util.Random;

@Controller
public class MailcodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// 得到随机的字符串,用于发送验证码的内容
	public String getNumbers(int size) {
		String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		String numString = "";
		Random r = new Random();
		for (int i = 0; i < size; i++) {
			char c = str.charAt(r.nextInt(str.length()));
			numString = numString + c;
		}
		return numString;
	}
	@RequestMapping("/email")
	public void email(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		response.setCharacterEncoding("UTF-8");
		// 设置返回的编码格式,同时设置客户端和服务端的编码格式
		response.setContentType("application/json; charset=UTF-8");

		String email = request.getParameter("email");
		System.out.println("email" + email);

		String emailString = getNumbers(5);
		System.out.println("验证码" + emailString);

		HttpSession session = request.getSession();

		session.setAttribute("email", email);
		session.setAttribute("emailString", emailString);


		// 创建Properties类用于记录邮箱的一些属性
		Properties props = new Properties();
		// 表示SMTP发送邮件,必须进行身份验证
		props.put("mail.smtp.auth", "true");
		// 此处填写SMTP服务器
		props.put("mail.smtp.host", "smtp.qq.com");
		// 端口号,QQ邮箱端口465或587
		props.put("mail.smtp.port", "587");
		// 此处填写,写信人的账号
		props.put("mail.user", "3131019721@qq.com");
		// 此处填写16位STMP口令
		props.put("mail.password", "qzsmlbypynsedc");

		// 构建授权信息,用于进行SMTP进行身份验证
		Authenticator authenticator = new Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				// 用户名、密码
				String userName = props.getProperty("mail.user");
				String password = props.getProperty("mail.password");
				return new PasswordAuthentication(userName, password);
			}
		};
		// 使用环境属性和授权信息,创建邮件会话
		Session mailSession = Session.getInstance(props, authenticator);
		// 创建邮件消息
		MimeMessage message = new MimeMessage(mailSession);
		try {
			// 设置发件人
			InternetAddress form = new InternetAddress(props.getProperty("mail.user"));
			message.setFrom(form);
			// 设置收件人的邮箱
			InternetAddress to = new InternetAddress(email);
			message.setRecipient(MimeMessage.RecipientType.TO, to);
			// 设置邮件标题
			message.setSubject("资产管理系统验证码");
			// 设置邮件内容体
			message.setContent("验证码:" + emailString, "text/html;charset=UTF-8");
			// 发送邮件
			Transport.send(message);
			response.getWriter().write("{\"message\": \"验证码已发送,请查收!\"}");
		} catch (AddressException e) {
			session.setAttribute("messagesigh", "邮箱输入有误");
			e.printStackTrace();
			response.getWriter().write("{\"message\": \"发送验证码失败!\"}");
		} catch (MessagingException e) {
			session.setAttribute("messagesigh", "邮箱输入有误");
			e.printStackTrace();
			response.getWriter().write("{\"message\": \"发送验证码失败!\"}");
		}
	}
}

需要修改的地方,只需将写信人的账户改成自己的,然后在STMP口令,也就是申请的授权码复制即可。

	// 此处填写,写信人的账号
		props.put("mail.user", "3131019721@qq.com");
	// 此处填写16位STMP口令
		props.put("mail.password", "qzsmlbypynsedc");

前端Ajax代码

<!-- 验证码输入框 -->
	<div class="form-group has-feedback">
		<input required type="text" name="captcha" class="form-control" id="captcha" placeholder="验证码">
		<span class="glyphicon glyphicon-question-sign form-control-feedback"></span>
	</div>
<!-- 发送验证码的按钮 -->
	<div class="form-group">
		<button type="button" class="btn btn-success" id="send-code">发送验证码</button>
	</div>


<!-- jQuery代码 -->

$(document).ready(function() {
			$('#send-code').click(function(e) {
				e.preventDefault(); // 防止表单的默认提交行为
                //获取输入框邮箱值
				var email = $('#email').val();
                //邮箱格式校验
				var emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
				if (emailPattern.test(email)) {
					$.ajax({
						url: '/email',
						type: 'POST',
						data: { email: email},
						dataType: 'json',
						success: function(response) {
								console.log(response)
						},
						error: function(e) {
							console.log(e)
						}
					});
				} else {
						console.log("输入错误")
				}
			});
		});

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vivado 时钟交互报告

步骤6&#xff1a;时钟交互报告 在创建约束之后或期间&#xff0c;必须验证约束是否完整且安全。 Vivado Design Suite默认情况下将所有时钟一起计时&#xff0c;除非您通过定义另有指定 时钟组或其他定时异常。set_clock_groups命令指定 异步或独占时钟域&#xff0c;并禁用它…

GIT | git提交注释自动添加信息头

GIT | git提交注释自动添加信息头 时间&#xff1a;2024年9月6日10:20:11 文章目录 GIT | git提交注释自动添加信息头1.操作2.commit-msg文件 1.操作 2.commit-msg文件 #!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit&q…

OXC:光交叉连接(optical cross-connect)-介绍

1. 引用 https://zhuanlan.zhihu.com/p/259797386 实现对光网络的监控和光路切换 - MEMS 光开关-CSDN博客 MEMS光学器件— MEMS OXC&#xff08;光交叉互连开关&#xff09;_基于1n端口光开关构建的oxc-CSDN博客 OXC和OADM_oadm oxc-CSDN博客 光的世界第二弹&#xff1a;O…

2024全国大学生数学建模竞赛B题完整论文讲解

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年全国大学生数学建模竞赛B 题 生产过程中的决策问题 完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

SCI论文中通过图更好的呈现出自己性能的优越性

1.在大家广义的对自己工作与前人工作比较的时候&#xff0c;一般大家选用的都是表格比较方法。表格比较确实在一点程度上展示出了差异性&#xff0c;接下来我将展示用图的方法比较。例如以下的数据比较。 2.首先按照数据画出图形&#xff0c;然后对图形进行优化。 3.双击图形…

Git 常用指令(分支、克隆、远程仓库、冲突)

Git 常用指令 用树的形式对代码的历史版本进行维护&#xff0c;有利于多人协作与代码回滚。 1. 基本概念 工作区&#xff1a;仓库的目录。工作区是独立于各个分支的。暂存区&#xff1a;数据暂时存放的区域&#xff0c;类似于工作区写入版本库前的缓存区。暂存区是独立于各个…

使用 JAXB 将内嵌的JAVA对象转换为 xml文件

使用 JAXB 将内嵌的JAVA对象转换为 xml文件 1. 需求2. 实现&#xff08;1&#xff09;FileDesc类&#xff08;2&#xff09;MetaFileXml类&#xff08;3&#xff09;生成对应的xml文件 1. 需求 获取一个目录下所有文件的元数据信息&#xff08;文件名、大小、后缀等&#xff0…

Nginx安装方式

一、Nginx环境准备&#xff08;了解&#xff09; 1.1 Nginx版本介绍 Nginx的官方网站为: http://nginx.org 打开源码可以看到如下的页面内容 Nginx的官方下载网站为nginx: download&#xff0c;当然你也可以之间在首页选中右边的download进入版本下载网页。在下载页面我们会…

【软件测试】设计测试用例

目录 &#x1f4d5;引言 &#x1f340;测试用例 &#x1f6a9;概念 &#x1f6a9;设计测试用例的万能公式 &#x1f3c0;常规思考逆向思维发散性思维 &#x1f3c0;万能公式 &#x1f384;设计测试用例的方法 &#x1f6a9;基于需求的设计方法 &#x1f3c0;明确需求中…

使用Charles对安卓手机进行抓包

写在前面的话 Charles 介绍 Charles 的主要功能 网络请求拦截与分析 Charles 通过将自己配置成系统的代理服务器&#xff0c;拦截所有通过它的 HTTP 和 HTTPS 请求与响应。开发者可以查看每个网络请求的详细信息&#xff0c;包括请求的 URL、请求头、请求体、响应头、响应体…

Python和C++多尺度导图

&#x1f3af;要点 热化学属性观测蒙特卡罗似然比灵敏度分析时间尺度上动力学化学催化反应动力学建模自动微分电化学分析模型反应动力学数学模型渔业生态不确定性模型敏感性分析空间统计地理模型分析技术多维数据表征实现生成艺术图案流苏物体长度比&#xff0c;面积比和复杂度…

闯关leetcode——1.Two Sum

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/two-sum/description/ 内容 Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. You may assume that each input w…

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RS…

音视频开发之旅(92)-多模态Clip论文解读与源码分析

目录 1. 背景和问题 2. CLIP模型结构 3. 实验效果 4. 源码分析 5. CLIP的局限性和不足 6. 资料 一. 背景和问题 在做分类 检测以及分割任务时,数据的标注非常关键, 比如可用于分类任务的ImageNet数据集共有120万张图片1000个分类, 可用于目标检测和分割任务的COCO数据集…

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 服务器) int socket(int domain, int type, int protocol); domain&#xff1a;AF_INET&#xff1a;网络通信&#xff0c;AF_LOCAL&#xff1a;本地通信 type&#xff1a;UDP&#xff1a;SOCK_DGRAM&…

AI是不是真的能落地应用,未来看看这三个行业

大家好&#xff0c;我是凡人&#xff0c;最近也被GPT-4o刷爆了朋友圈&#xff0c;各种对OpenAI新布局的猜想也是层出不穷。GPT-4o再次将多模态交互拉到了新高度&#xff0c;一放出就颠覆了原有 AI 给传统行业带来新冲击。 还有不了解GPT-4o 的同学&#xff0c;可以查看我上一篇…

Java异常体系----深入讲解

JAVA异常体系 1.error 错误 程序无法处理的异常&#xff0c; 它是由JVM产生和抛出的,比如OutOfMemoryError.ThreadDeath等 示例&#xff1a; public class Test {public static void main(String[] args) {run();}public static void run(){run();} }堆栈溢出&#xff0c;…

828华为云征文|基于华为云Flexus云服务器X实例部搭建Halo博客平台

华为云征文&#xff5c;基于华为云Flexus云服务器X实例部搭建Halo博客平台 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Halo介绍2.1 Halo 简介2.2 Halo 特点 三、本次实践介绍3.1 本次实践简…

Linux日志-journal日志

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

Linux Debian12安装原生版微信

1.原生版微信下载地址&#xff1a; https://archive.ubuntukylin.com/software/pool/partner/找到weixin&#xff0c;2022年05月23日最新版本&#xff0c;weixin_2.1.4_amd64.deb&#xff0c;下载。 2.微信安装&#xff1a; sudo dpkg -i weixin_2.1.4_amd64.deb3.登陆即可。…