当前位置:   article > 正文

SpringBoot发送邮箱验证码进行校验_springboot给邮箱发送验证码

springboot给邮箱发送验证码

最近在试了试使用验证码注册账号和修改密码,这个难度一般,只要按照对应步骤即可。

(在校验验证码时出现小问题,涉及到Redis暂时存储验证码)

一、在此之前需要获得邮箱授权码(我用的是QQ邮箱的)

1、网页版QQ邮箱右上角点击账号与安全

2、进入安全设置,最下面POP3服务需要先绑定手机号

3、点击前往绑定后弹出该页面,要发送对应的短信进行验证

4、绑定后会给你发一个验证码,输入验证码弹出绑定成功页面

5、接下来点击开启服务

6、还要继续发送验证码,可以扫码,也可以选择其他验证方式(也是发短信)

7、短信完成验证后,点击我已发送,弹出授权码窗口

可以先记住授权码,待会需要使用,使用授权码意义是不需要在第三方等应用上用密码登录,只需使用授权码即可,防止泄露密码。

二、回到SpringBoot工程

1、先导入邮箱对应依赖

  1. <!--邮箱授权码,我用的是QQ-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>

2、配置resources资源文件下的properties文件(我是用的是yml格式)

  1. spring:
  2. mail:
  3. host: smtp.qq.com
  4. username: XXXX@qq.com #用来发邮件的邮箱
  5. password: XXXX #你的邮箱授权码
  6. default-encoding: UTF-8

其中host后面跟的是收邮件/发邮件的服务器(收pop3/发smtp),可以自行百度

3、发送验证码接口实现类SendCodeServiceImpl ,前端传来参数邮箱param

  1. import com.xuecheng.checkcode.model.CheckCodeResultDto;
  2. import com.xuecheng.checkcode.service.AbstractCheckCodeService;
  3. import com.xuecheng.checkcode.service.SendCodeService;
  4. import org.apache.http.HttpEntity;
  5. import org.apache.http.ParseException;
  6. import org.apache.http.client.ClientProtocolException;
  7. import org.apache.http.client.methods.CloseableHttpResponse;
  8. import org.apache.http.client.methods.HttpGet;
  9. import org.apache.http.impl.client.CloseableHttpClient;
  10. import org.apache.http.impl.client.HttpClients;
  11. import org.apache.http.util.EntityUtils;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.mail.SimpleMailMessage;
  15. import org.springframework.mail.javamail.JavaMailSender;
  16. import org.springframework.stereotype.Service;
  17. import java.io.IOException;
  18. /**
  19. * @description:
  20. * @author: xinTong
  21. * @create: 2024-02-14 12:53
  22. **/
  23. @Service
  24. public class SendCodeServiceImpl implements SendCodeService {
  25. @Autowired
  26. private AbstractCheckCodeService abstractCheckCodeService;
  27. @Value("${spring.mail.username}")
  28. private String sendUser;
  29. @Autowired
  30. private JavaMailSender javaMailSender;
  31. public CheckCodeResultDto send(String param) {
  32. //邮箱验证码
  33. // 1、先生成验证码
  34. // 2、存入Redis
  35. AbstractCheckCodeService.GenerateResult emailCode = abstractCheckCodeService
  36. .generate(null, 4, "EmailCode", 180);
  37. SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  38. simpleMailMessage.setFrom(sendUser);
  39. simpleMailMessage.setTo(param);
  40. simpleMailMessage.setSubject("验证码");
  41. simpleMailMessage.setText("Code:" + emailCode.getCode());
  42. javaMailSender.send(simpleMailMessage);
  43. CheckCodeResultDto checkCodeResultDto = new CheckCodeResultDto();
  44. checkCodeResultDto.setKey(emailCode.getKey());
  45. return checkCodeResultDto;
  46. }
  47. }

其中的参数是Form --邮件发送者,Subject--邮件标题,Test--邮件内容,To--邮件收件者

4、存入中间件Redis中

向之前的properties配置类中添加

  1. redis:
  2. host: localhost #你的主机
  3. port: 6379 #端口号
  4. password: redis #你的redis密码
  5. database: 0
  6. lettuce:
  7. pool:
  8. max-active: 20
  9. max-idle: 10
  10. min-idle: 0
  11. timeout: 10000

Redis工具类

  1. import com.xuecheng.checkcode.service.CheckCodeService;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.core.RedisTemplate;
  4. import org.springframework.stereotype.Component;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.util.concurrent.TimeUnit;
  8. /**
  9. * redis存储验证码
  10. */
  11. @Component("RedisCheckCodeStore")
  12. public class RedisCheckCodeStore implements CheckCodeService.CheckCodeStore {
  13. @Autowired
  14. RedisTemplate redisTemplate;
  15. @Override
  16. public void set(String key, String value, Integer expire) {
  17. redisTemplate.opsForValue().set(key,value,expire, TimeUnit.SECONDS);
  18. }
  19. @Override
  20. public String get(String key) {
  21. return (String) redisTemplate.opsForValue().get(key);
  22. }
  23. @Override
  24. public void remove(String key) {
  25. redisTemplate.delete(key);
  26. }
  27. }

 验证码生成工具类:

  1. import com.xuecheng.checkcode.model.CheckCodeParamsDto;
  2. import com.xuecheng.checkcode.model.CheckCodeResultDto;
  3. import lombok.Data;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang.StringUtils;
  6. @Slf4j
  7. public abstract class AbstractCheckCodeService implements CheckCodeService {
  8. protected CheckCodeGenerator checkCodeGenerator;
  9. protected KeyGenerator keyGenerator;
  10. protected CheckCodeStore checkCodeStore;
  11. public abstract void setCheckCodeGenerator(CheckCodeGenerator checkCodeGenerator);
  12. public abstract void setKeyGenerator(KeyGenerator keyGenerator);
  13. public abstract void setCheckCodeStore(CheckCodeStore CheckCodeStore);
  14. /**
  15. * @description 生成验证公用方法
  16. * @param checkCodeParamsDto 生成验证码参数
  17. * @param code_length 验证码长度
  18. * @param keyPrefix key的前缀
  19. * @param expire 过期时间
  20. * @return com.xuecheng.checkcode.service.AbstractCheckCodeService.GenerateResult 生成结果
  21. */
  22. public GenerateResult generate(CheckCodeParamsDto checkCodeParamsDto,Integer code_length,String keyPrefix,Integer expire){
  23. //生成四位验证码
  24. String code = checkCodeGenerator.generate(code_length);
  25. log.debug("生成验证码:{}",code);
  26. //生成一个key
  27. String key = keyGenerator.generate(keyPrefix);
  28. //存储验证码
  29. checkCodeStore.set(key,code,expire);
  30. //返回验证码生成结果
  31. GenerateResult generateResult = new GenerateResult();
  32. generateResult.setKey(key);
  33. generateResult.setCode(code);
  34. return generateResult;
  35. }
  36. @Data
  37. public class GenerateResult{
  38. String key;
  39. String code;
  40. }
  41. public abstract CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto);
  42. public boolean verify(String key, String code){
  43. if (StringUtils.isBlank(key) || StringUtils.isBlank(code)){
  44. return false;
  45. }
  46. String code_l = checkCodeStore.get(key);
  47. if (code_l == null){
  48. return false;
  49. }
  50. boolean result = code_l.equalsIgnoreCase(code);
  51. if(result){
  52. //删除验证码 -- Redis中的
  53. checkCodeStore.remove(key);
  54. }
  55. return result;
  56. }
  57. }

 5、验证码接口CheckCodeService

  1. import com.xuecheng.checkcode.model.CheckCodeParamsDto;
  2. import com.xuecheng.checkcode.model.CheckCodeResultDto;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import javax.annotation.Resource;
  5. import java.util.Map;
  6. public interface CheckCodeService {
  7. /**
  8. * @description 生成验证码
  9. * @param checkCodeParamsDto 生成验证码参数
  10. * @return com.xuecheng.checkcode.model.CheckCodeResultDto 验证码结果
  11. */
  12. CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto);
  13. /**
  14. * @description 校验验证码
  15. * @param key
  16. * @param code
  17. * @return boolean
  18. */
  19. public boolean verify(String key, String code);
  20. /**
  21. * @description 验证码生成器
  22. */
  23. public interface CheckCodeGenerator{
  24. /**
  25. * 验证码生成
  26. * @return 验证码
  27. */
  28. String generate(int length);
  29. }
  30. /**
  31. * @description key生成器
  32. */
  33. public interface KeyGenerator{
  34. /**
  35. * key生成
  36. * @return 验证码
  37. */
  38. String generate(String prefix);
  39. }
  40. /**
  41. * @description 验证码存储
  42. */
  43. public interface CheckCodeStore{
  44. /**
  45. * @description 向缓存设置key
  46. * @param key key
  47. * @param value value
  48. * @param expire 过期时间,单位秒
  49. * @return void
  50. */
  51. void set(String key, String value, Integer expire);
  52. String get(String key);
  53. void remove(String key);
  54. }
  55. }

可以试试,有问题可以私聊我,有可能会漏一点代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/686358
推荐阅读
相关标签
  

闽ICP备14008679号