springboot实现邮箱验证码功能

本文实例为大家分享了springboot实现邮箱验证码功能的具体代码,供大家参考,具体内容如下

我这边使用的QQ邮箱

1、首先创建maven项目,配置pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>com.example</groupId>
 <artifactId>springbootdemo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>springbootdemo</name>
 <description>Demo project for Spring Boot</description>

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.4.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.mybatis.spring.boot</groupId>
 <artifactId>mybatis-spring-boot-starter</artifactId>
 <version>1.3.2</version>
 </dependency>
 <!--邮件发送核心包-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-mail</artifactId>
 </dependency>
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.4</version>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
 </dependency>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
  </dependency>

 <!--mybatis分页插件-->
 <dependency>
 <groupId>com.github.pagehelper</groupId>
 <artifactId>pagehelper</artifactId>
 <version>4.1.6</version>
 </dependency>

 </dependencies>

 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 <resources>
 <resource>
 <directory>src/main/java</directory>
  <includes>
  <include>**/*.xml</include>
  </includes>
 </resource>
 </resources>
 </build>

</project>

2、配置springboot,我这里使用的是properties方式

#配置Mybatis别名和扫描包
mybatis.type-aliases-package=com.demo.bean
mybatis.mapper-locations=classpath:mapper/*.xml

#数据库相关
spring.datasource.url=jdbc:mysql://localhost:3306/ssm?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#配置日志
logging.level.root=info
logging.level.com.demo.mapper=debug

#配置视图前缀和后缀
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

#邮件发送配置
spring.mail.default-encoding=UTF-8
spring.mail.host=smtp.qq.com
spring.mail.username=你的邮箱
spring.mail.password=邮箱授权码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

#thymeleaf配置
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.cache=false

邮箱授权码可以按以下方法获取
打开QQ邮箱网页→设置→账户→POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务→开启POP3/SMTP服务,然后就能看到授权码了

3、编写mailService

${spring.mail.username}是在properties中配置的属性,这里有一个方法,第一个是发送普通邮件,第二个是发送带有附件的邮件

@Service("mailService")
public class MailService {
 @Value("${spring.mail.username}")
 private String from;
 @Autowired
 private JavaMailSender mailSender;

 Logger logger = LoggerFactory.getLogger(this.getClass());

 public void sendSimpleMail(String to,String title,String content){
  SimpleMailMessage message = new SimpleMailMessage();
  message.setFrom(from);
  message.setTo(to);
  message.setSubject(title);
  message.setText(content);
  mailSender.send(message);
  logger.info("邮件发送成功");
 }

 public void sendAttachmentsMail(String to, String title, String cotent, List<File> fileList){
  MimeMessage message = mailSender.createMimeMessage();
  try {
   MimeMessageHelper helper = new MimeMessageHelper(message,true);
   helper.setFrom(from);
   helper.setTo(to);
   helper.setSubject(title);
   helper.setText(cotent);
   String fileName = null;
   for (File file:fileList) {
    fileName = MimeUtility.encodeText(file.getName(), "GB2312", "B");
    helper.addAttachment(fileName, file);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  mailSender.send(message);
  logger.info("邮件发送成功");
 }
}

4、编写controller

@Controller
public class MailController {
 @Autowired
 private MailService mailService;

 @RequestMapping("getCheckCode")
 @ResponseBody
 public String getCheckCode(String email){
  String checkCode = String.valueOf(new Random().nextInt(899999) + 100000);
  String message = "您的注册验证码为:"+checkCode;
  try {
   mailService.sendSimpleMail(email, "注册验证码", message);
  }catch (Exception e){
   return "";
  }
  return checkCode;
 }
}

5、编写页面

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>注册</title>
 <link rel="stylesheet" href="layui/css/layui.css" rel="external nofollow" >
 <script src="layui/layui.js"></script>
</head>
<body style="width: 100%;height: 100%;">
 <div style="margin-top: 15%;">
  <div class="layui-main" style="width: 700px;">
   <h1 style="text-align: center">请输入注册信息</h1>
   <form class="layui-form layui-form-pane">
    <div class="layui-form-item">
     <label class="layui-form-label">邮箱:</label>
     <div class="layui-input-block">
      <input id="email" type="email" name="username" class="layui-input" lay-verify="required"/>
     </div>
    </div>
    <div class="layui-form-item">
     <label class="layui-form-label">密码:</label>
     <div class="layui-input-block">
      <input id="password" type="password" name="password" class="layui-input" lay-verify="required"/>
     </div>
    </div>
    <div class="layui-form-item">
     <label class="layui-form-label">邮箱验证码:</label>
     <div class="layui-input-block">
      <input id="checkCode" type="text" name="checkCode" class="layui-input" lay-verify="required"/>
      <button id="sendCheckCode" type="button" class="layui-btn layui-btn-normal">获取验证码</button>
     </div>
    </div>
    <div class="layui-form-item">
     <div class="layui-input-block">
      <button class="layui-btn" lay-submit lay-filter="register">确认</button>
     </div>
    </div>
   </form>
  </div>
 </div>
 <script>
  layui.use("form",function () {
   var form = layui.form;
   var $ = layui.$;

   form.on("submit(register)",function (data) {
    var inputCheckCode = $("#checkCode").val();
    if (inputCheckCode == checkCode){
     $.ajax({
      url:"/register",
      type:"POST",
      data:data.field,
      async:false,
      success:function (text) {
       if ("ok" == text){
        layer.alert("注册成功",function () {
         window.location.href = "index.html";
        });
       }else{
        layer.alert("注册失败");
       }
      }
     });
    } else{
     layer.msg("验证码输入错误");
    }
    return false;
   });

   //验证码
   var checkCode = "";

   $("#sendCheckCode").click(function () {
    var email = $("#email").val();
    if (email == null || email == ""){
     layer.msg("请输入邮箱!!!");
     return;
    }
    var index = layer.open({
     type:3,
     content:"邮件发送中..."
    });

    $.ajax({
     url:"/getCheckCode?email="+email,
     type:"get",
     success:function (text) {
      if (text != null && text != ""){
       layer.close(index);
       layer.msg("已发送");
       checkCode = text;
       countDown();
      } else{
       layer.alert("获取失败,请重新获取")
      }
     }
    });
   });

   var maxTime = 60;
   function countDown(){
    if (maxTime == 0){
     checkCode = "";
     $("#sendCheckCode").removeClass("layui-btn-disabled");
     $("#sendCheckCode").removeAttr("disabled")
     $("#sendCheckCode").html("获取验证码");
     maxTime = 60;
    }else{
     $("#sendCheckCode").attr("disabled","disabled");
     $("#sendCheckCode").addClass("layui-btn-disabled");
     form.render();
     $("#sendCheckCode").html(maxTime+"秒后重新获取");
     maxTime--;
     setTimeout(countDown,1000);
    }
   }

  });
 </script>
</body>
</html>

6、测试

邮件发送

发送成功

收到邮件

60s禁止重发

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Security OAuth2集成短信验证码登录以及第三方登录

    前言 基于SpringCloud做微服务架构分布式系统时,OAuth2.0作为认证的业内标准,Spring Security OAuth2也提供了全套的解决方案来支持在Spring Cloud/Spring Boot环境下使用OAuth2.0,提供了开箱即用的组件.但是在开发过程中我们会发现由于Spring Security OAuth2的组件特别全面,这样就导致了扩展很不方便或者说是不太容易直指定扩展的方案,例如: 图片验证码登录 短信验证码登录 微信小程序登录 第三方系统登录 CAS单点登录

  • Spring Boot 验证码的生成和验证详解

    前言 本文介绍的imagecode方法是一个生成图形验证码的请求,checkcode方法实现了对这个图形验证码的验证.从验证码的生成到验证的过程中,验证码是通过Session来保存的,并且设定一个验证码的最长有效时间为5分钟.验证码的生成规则是从0~9的数字中,随机产生一个4位数,并增加一些干扰元素,最终组合成为一个图形输出 1.验证码生成类 import java.awt.*; import java.awt.image.BufferedImage; import java.io.Output

  • Spring MVC 中 短信验证码功能的实现方法

    在外部网站中短信的验证很有必要,比如在实现注册.验证用户信息等的情况下.在SpringMVC中的实现如下: 短信接口 短信接口,有些企业会购买的有移动的短信平台接口.如果是个人或者是小企业可以使用一些云服务的.比如百度的API Store上面的. 我使用的是:http://apistore.baidu.com/apiworks/servicedetail/1018.html 当然短信接口肯定都是要付费的,而且是基于模板的,具体的使用说明可以看这个网址里面的使用说明. 前端界面 前端的界面,可能如

  • Spring框架生成图片验证码实例

    这篇文章会从前台页面到后台实现完整的讲解,下面跟着小编一起来看看. 1.前台的代码,image.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &quo

  • SpringBoot实现前端验证码图片生成和校验

    SpringBoot下实现前端验证码图片的生成和校验,供大家参考,具体内容如下 1.效果 点击验证码可以获取新的验证码 2.原理 后台生成验证码图片,将图片传到前台. 后台在session中保存验证码内容. 前台输入验证码后传到后台在后台取出session中保存的验证码进行校验. 注意,验证码的明文是不能传送到前端的.前端内容都是透明的,不安全.验证码是用来防机器人并不是单单防人.如果把验证码明文传到前端很容易就会被破解. 3.图片生成 验证码生成工具类RandomValidateCodeUti

  • Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    前言 短信验证码是通过发送验证码到手机的一种有效的验证码系统.主要用于验证用户手机的合法性及敏感操作的身份验证. 现在市面上的短信服务平台有很多.大家在选择的时候未免会有些不好抉择.本人建议选择短信服务商应遵循以下几点: 服务商知名度高,业务流量大.(这样的平台可信度高) 服务稳定,不能经常宕机.(保证自身业务的流畅运行) 文档全面详细.(没文档怎么玩?) 最近的一个项目中,注册和修改密码时需要用到短信验证码校验手机号的功能.本人也是对比几家后,直接选择阿里云通信的短信服务.(本身项目服务器也是

  • Spring Security Oauth2.0 实现短信验证码登录示例

    本文介绍了Spring Security Oauth2.0 实现短信验证码登录示例,分享给大家,具体如下: 定义手机号登录令牌 /** * @author lengleng * @date 2018/1/9 * 手机号登录令牌 */ public class MobileAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecur

  • SpringBoot实现短信验证码校验方法思路详解

    有关阿里云通信短信服务验证码的发送,请参考我的另一篇文章   Springboot实现阿里云通信短信服务有关短信验证码的发送功能 思路 用户输入手机号后,点击按钮获取验证码.并设置冷却时间,防止用户频繁点击. 后台生成验证码并发送到用户手机上,根据验证码.时间及一串自定义秘钥生成MD5值,并将时间也传回到前端. 用户输入验证码后,将验证码和时间传到后台.后台先用当前时间减去前台传过来的时间验证是否超时.如果没有超时,就用用户输入的验证码 + 时间 + 自定义秘钥生成MD5值与之前的MD5值比较,

  • SpringBoot 集成Kaptcha实现验证码功能实例详解

    在一个web应用中验证码是一个常见的元素.不管是防止机器人还是爬虫都有一定的作用,我们是自己编写生产验证码的工具类,也可以使用一些比较方便的验证码工具.在网上收集一些资料之后,今天给大家介绍一下kaptcha的和springboot一起使用的简单例子. 准备工作: 1.你要有一个springboot的hello world的工程,并能正常运行. 2.导入kaptcha的maven: <!-- https://mvnrepository.com/artifact/com.github.penggl

  • 实例详解Spring Boot实战之Redis缓存登录验证码

    本章简单介绍redis的配置及使用方法,本文示例代码在前面代码的基础上进行修改添加,实现了使用redis进行缓存验证码,以及校验验证码的过程. 1.添加依赖库(添加redis库,以及第三方的验证码库) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency&

随机推荐