1.实现流程
获取用户输入的邮箱地址,发送随机成功的验证码。把验证码和邮箱地址存入redis缓存,表单提交时判断缓存中是否存在相应的数据,存在允许登录.删除缓存。
2.事前准备
1.下载redis数据库,开启服务器。
2.导入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.使用了QQ邮箱进行邮件发送,首先得先配置邮件客户端。
1.打开QQ邮箱点击设置之后点账户。
2.在账户页面,开启所有服务,点击生成授权码,获取授权码作为之后发送邮箱的密码。
3.在配置文件中配置。
spring.mail.username=#输入你的邮箱地址
spring.mail.password=#输入第二步获取到的授权码
#设置邮件发送的服务器。
spring.mail.host=smtp.qq.com
#开启ssl安全连接。
spring.mail.properties.smtp.ssl.enable=true
3.实现代码
1.登录页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form th:action="@{/login}" method="post">
<input type="email" name="email" id="email" >邮箱
<input type="button" id="send" value="获取验证码">
<br>
<input type="text" name="verificationCode" >输入验证码
<br>
<input type="submit" value="提交">
</form>
<p id="msg" style="color: springgreen"></p>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script th:inline="javascript">
console.log(url);
$('#send').click(function () {
$.ajax({
url: "/send",
data: {
email:$("#email").val()
},
dataType: "json",
method:"GET",
success: function(data){
$("#msg").text("已发送");
},
error:function () {
console.log("网络错误");
}
})
});
</script>
</body>
</html>
在点击获取验证码后,发送请求。如果请求成功提示已发送信息。用户提交表单时验证信息是否正确。
2.接受邮箱地址发送验证码。
@Controller
public class MyController {
@Autowired
SendMailService sendMailService;
@RequestMapping("/")
public String index(){
return "index";
}
@ResponseBody
@GetMapping("/send")
public String sendMail(String email){
/*发送邮件方法*/
sendMailService.sendMail(email);
return "true";
}
@ResponseBody
@PostMapping("login")
public String login(User user){
//验证信息
Boolean verification = sendMailService.verification(user);
if(verification){
return "登陆成功";
}
return "登陆失败";
}
}
3.service层,在serice中发送邮件.将信息存入redis,将发送邮件作为异步请求。
在入口类上中添加能够异步访问。
@EnableAsync
@Service
public class SendMailService {
//获取redis模板类
@Autowired
RedisTemplate redisTemplate;
//获取邮件发送类
@Autowired
JavaMailSender javaMailSender;
//异步请求
@Async
public void sendMail(String emailAddress){
//初始化邮件信息类
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("这是标题");
simpleMailMessage.setFrom("");//输入你的QQ邮箱
simpleMailMessage.setTo(emailAddress);
//获取验证码
String verification = Util.generateCode();
//将验证码存放进邮箱
simpleMailMessage.setText("hello World 这是你的验证码"+verification);
//获取redis操作类
ValueOperations valueOperations = redisTemplate.opsForValue();
javaMailSender.send(simpleMailMessage);
/*设置缓存*/
valueOperations.set(emailAddress,verification);
/**
* K key, final long timeout, final TimeUnit unit
* key 存储数据的key值
* TimeUnit 时间单位
* timeout 数据的过期时间
* */
redisTemplate.expire(emailAddress,60*5, TimeUnit.SECONDS);
}
//验证用户信息
public Boolean verification(User user){
ValueOperations valueOperations = redisTemplate.opsForValue();
/*从redis中获取验证码*/
String verificationCode = (String) valueOperations.get(user.getEmail());
System.out.println(verificationCode);
/*判断提交的信息是否正确*/
if(verificationCode!=null&&verificationCode.equals(user.getVerificationCode())){
/*删除缓存中的数据*/
redisTemplate.delete(user.getEmail());
return true;
}
return false;
}
}
随机生成验证码
public class Util {
static public String generateCode() {
Random random = new Random();
char[] chars=new char[6];
for (int i = 0; i < 6; i++) {
Character c=null;
switch (random.nextInt(3)) {
case 0:
c = (char) ('A' + random.nextInt('Z' - 'A' + 1));
break;
case 1:
c = (char) ('0' + random.nextInt('9' - '0' + 1));
break;
case 2:
c = (char) ('a' + random.nextInt('z' - 'a' + 1));
break;
}
System.out.println(c);
chars[i]=c;
}
return String.valueOf(chars);
}
}
Userbean
public class User {
private String email;
private String verificationCode;
GetterAndSetter....
}
4.实现效果
获取验证码
输入获取到的验证码登陆