迷途漫漫,终有一归。——米兰昆德拉
引入的依赖
<!--email--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>
注册
从前端开始,用户到注册页面之后,填写用户信息(这里的uid其实不应该存在,重点是,请自行忽略页面的外观)
在点击“获取验证码之后”,前端发送一个ajax请求:
<script>function sendEmail() {var email = $("#email");$.ajax({url: "/sendEmail", data: {"email": email.val()}, type: "post", success: function (res) {if (res === "success") {confirm("send successful!")}}})}</script>
后端相应的接口在接受到请求之后,开始调用方法发送验证码
@PostMapping("sendEmail")@ResponseBodypublic String sendEmail(String email, HttpSession session) {myEmail.sendMail(email, session);return "success";}
在调用发送邮件的方法之前,我们需要在
application.yml
中做一些配置:
# 邮箱配置mail:host: username: **************password: **************default-encoding: utf-8properties:mail:smtp:auth: truestarttls:enable: truerequired: true
其中:
username
后边需要填写发件人的邮箱地址,要注意的是:password
后边需要的是这个东西,并不是发件人的登陆密码,而是在登陆到发件人的QQ邮箱(电脑登陆)后,点到设置->账户
点击开启POP3之后会获得的一个字符串
在设置好了配置文件之后,再编写发送邮件的方法。(如下)方法中携带了收件人,也就是用户的邮箱,session两个参数,session参数用来以后存储验证码以便于校验。
package com.yuxi.util;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;import org.ponent;import javax.annotation.Resource;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import javax.servlet.http.HttpSession;import java.util.Random;@Componentpublic class MyEmail {@Value("${spring.mail.username}")private String from;@ResourceJavaMailSender javaMailSender;/*** 发送验证码** @param email* @param session*/public void sendMail(String email, HttpSession session) {MimeMessage mimeMessage = javaMailSender.createMimeMessage();try {MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);// 设置发件人mimeMessageHelper.setFrom(from);// 设置收件人mimeMessageHelper.setTo(email);// 设置邮件主题mimeMessageHelper.setSubject("信息管理验证");//生成随机数String random = randomInteger();//将随机数放置到session中session.setAttribute("email",email);session.setAttribute("code",random);// 设置验证码的样式mimeMessageHelper.setText("<font style='color:green'>"+random+"</font>",true);javaMailSender.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();}}/*** 生成随机验证码** @return*/private String randomInteger() {Random random = new Random();StringBuffer stringBuffer = new StringBuffer();//生成6位的随机数for (int i = 0;i<6;i++){int i1 = random.nextInt(10);stringBuffer.append(i1);}return stringBuffer.toString();}}
在执行完上边这个类中的方法之后,正在注册的用户便会收到邮箱发送的验证码。用户就可以输入验证码并且提交了。
校验
接下来,后端在接受到用户提交的信息之后,就需要校验验证码了。方法如下:
/*** 验证注册信息并且保存用户数据** @param userVer* @param session* @return*/@PostMapping("registered")public String registered(UserVer userVer, HttpSession session, Model model) {// 获取session中的验证信息String email = (String) session.getAttribute("email");String code = (String) session.getAttribute("code");// 获取表单中提交的验证信息String verCode = userVer.getCode();// 失败之后重新注册if (email == null || email.isEmpty()) {return "userRegistered";} else if (!code.equals(verCode)) {return "userRegistered";}// 保存数据userService.insert(UserVer2User.toUser(userVer));//下边返回的就是注册成功之后的跳转了return userController.selectAll(model);}
值得一说的是方法中的
UserVer userVer
这个参数了,这个参数其实是在数据库中存储的对象属性中加了一个code
验证码属性(最后一行),如下:
@Datapublic class UserVer {private String name;private String password;private int age;private String email;private String sex;private String addr;// 验证码private String code;}
而真正在数据库中存储的对象属性是这样的:
@Data@AllArgsConstructor@NoArgsConstructorpublic class User implements Serializable {private static final long serialVersionUID = 432596037690782342L;private Integer uid;private String name;private String sex;private Integer age;private String addr;private String email;private String password;}
这是因为前端传过来的对象中包含了
验证码
这个属性,但是显而易见,我们不能将用户输入的随机验证码也存储到数据库中,所以这里需要一个UserVer
的中间对象来保存从前端传过来的对象,而在校验完之后,需要存储数据库的时候调用方法:
userService.insert(UserVer2User.toUser(userVer));
将
UserVer
对象转换成正真的user
对象之后再进行存储,方法如下:
/*** @author Administrator*/public class UserVer2User {/*** 将表单中的对象转化为数据库中存储的用户对象(剔除表单中的code)* @param userVer* @return*/public static User toUser(UserVer userVer) {// 创建一个数据库中存储的对象User user = new User();// 传值user.setUid(null);user.setName(userVer.getName());user.setEmail(userVer.getEmail());user.setPassword(userVer.getPassword());user.setSex(userVer.getSex());user.setAge(userVer.getAge());user.setAddr(userVer.getAddr());// 返回包装后的对象return user;}}
uid是自增的,设置为空就好
至此,邮箱的发送及验证完成。