1.實(shí)現(xiàn)流程
獲取用戶輸入的郵箱地址,發(fā)送隨機(jī)成功的驗(yàn)證碼重荠。把驗(yàn)證碼和郵箱地址存入redis緩存箭阶,表單提交時(shí)判斷緩存中是否存在相應(yīng)的數(shù)據(jù),存在允許登錄.刪除緩存。
2.事前準(zhǔn)備
1.下載redis數(shù)據(jù)庫,開啟服務(wù)器。
2.導(dǎo)入依賴仇参。
<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郵箱進(jìn)行郵件發(fā)送,首先得先配置郵件客戶端嘹叫。
1.打開QQ郵箱點(diǎn)擊設(shè)置之后點(diǎn)賬戶。
2.在賬戶頁面,開啟所有服務(wù),點(diǎn)擊生成授權(quán)碼,獲取授權(quán)碼作為之后發(fā)送郵箱的密碼诈乒。
3.在配置文件中配置罩扇。
spring.mail.username=#輸入你的郵箱地址
spring.mail.password=#輸入第二步獲取到的授權(quán)碼
#設(shè)置郵件發(fā)送的服務(wù)器。
spring.mail.host=smtp.qq.com
#開啟ssl安全連接怕磨。
spring.mail.properties.smtp.ssl.enable=true
3.實(shí)現(xiàn)代碼
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="獲取驗(yàn)證碼">
<br>
<input type="text" name="verificationCode" >輸入驗(yàn)證碼
<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("已發(fā)送");
},
error:function () {
console.log("網(wǎng)絡(luò)錯(cuò)誤");
}
})
});
</script>
</body>
</html>
在點(diǎn)擊獲取驗(yàn)證碼后,發(fā)送請求喂饥。如果請求成功提示已發(fā)送信息。用戶提交表單時(shí)驗(yàn)證信息是否正確肠鲫。
2.接受郵箱地址發(fā)送驗(yàn)證碼员帮。
@Controller
public class MyController {
@Autowired
SendMailService sendMailService;
@RequestMapping("/")
public String index(){
return "index";
}
@ResponseBody
@GetMapping("/send")
public String sendMail(String email){
/*發(fā)送郵件方法*/
sendMailService.sendMail(email);
return "true";
}
@ResponseBody
@PostMapping("login")
public String login(User user){
//驗(yàn)證信息
Boolean verification = sendMailService.verification(user);
if(verification){
return "登陸成功";
}
return "登陸失敗";
}
}
3.service層,在serice中發(fā)送郵件.將信息存入redis,將發(fā)送郵件作為異步請求。
在入口類上中添加能夠異步訪問导饲。
@EnableAsync
@Service
public class SendMailService {
//獲取redis模板類
@Autowired
RedisTemplate redisTemplate;
//獲取郵件發(fā)送類
@Autowired
JavaMailSender javaMailSender;
//異步請求
@Async
public void sendMail(String emailAddress){
//初始化郵件信息類
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("這是標(biāo)題");
simpleMailMessage.setFrom("");//輸入你的QQ郵箱
simpleMailMessage.setTo(emailAddress);
//獲取驗(yàn)證碼
String verification = Util.generateCode();
//將驗(yàn)證碼存放進(jìn)郵箱
simpleMailMessage.setText("hello World 這是你的驗(yàn)證碼"+verification);
//獲取redis操作類
ValueOperations valueOperations = redisTemplate.opsForValue();
javaMailSender.send(simpleMailMessage);
/*設(shè)置緩存*/
valueOperations.set(emailAddress,verification);
/**
* K key, final long timeout, final TimeUnit unit
* key 存儲(chǔ)數(shù)據(jù)的key值
* TimeUnit 時(shí)間單位
* timeout 數(shù)據(jù)的過期時(shí)間
* */
redisTemplate.expire(emailAddress,60*5, TimeUnit.SECONDS);
}
//驗(yàn)證用戶信息
public Boolean verification(User user){
ValueOperations valueOperations = redisTemplate.opsForValue();
/*從redis中獲取驗(yàn)證碼*/
String verificationCode = (String) valueOperations.get(user.getEmail());
System.out.println(verificationCode);
/*判斷提交的信息是否正確*/
if(verificationCode!=null&&verificationCode.equals(user.getVerificationCode())){
/*刪除緩存中的數(shù)據(jù)*/
redisTemplate.delete(user.getEmail());
return true;
}
return false;
}
}
隨機(jī)生成驗(yàn)證碼
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.實(shí)現(xiàn)效果
獲取驗(yàn)證碼
輸入獲取到的驗(yàn)證碼登陸