springboot3三层架构,基于session的邮箱验证
数据库:redis和mysql
实体类:
@Data
//json格式实体类
public class Result<T> {
private Integer code;
private boolean success;
private T message;
public Result(Integer code, boolean success, T message) {
this.code = code;
this.success = success;
this.message = message;
}
public static <T> Result<T> success(){
return new Result<>(0,true,null);
}
public static <T> Result<T> success(T data){
return new Result<>(0,true,data);
}
public static <T> Result<T> error(T message){
return new Result<>(1,false,message);
}
}
控制层逻辑:
第一步:接受从接口获取的两个关键字(为什么是email,和session)
PS:email是我们发送验证码的关键,就和手机号一样(手机号要钱。。。)session是为了安全
第二步:实现业务接口中的发送邮箱逻辑(为什么封装成一个字符串)
PS:这个是根据你的接口返回值
String sendValidateEmail(String email,String session);这条代码
第三步:返回成功后的内容,和失败后的内容
@Validated
@RestController
@RequestMapping("/api/auth")
public class userController {
@Resource
userService service;
//userservice接口
@PostMapping("/valid-Email")
public Result<String> validEmail(@Email @RequestParam("email")String email, HttpSession session){
String s = service.sendValidateEmail(email, session.getId());
if (s == null){
return Result.success("发送成功");
}
else return Result.error(s);
}
}
业务接口,返回字符串
public interface userService{
//发送email
String sendValidateEmail(String email,String session);
}
实现业务逻辑
第一步:将获取的数据封装成一个字符串
第二步:判断rides中是否有这个字符串,如果有返回提示
第三步:封装一个随机整数
第四步:调用SimpleMailMessage simpleMailMessage = new SimpleMailMessage();方法
实现发送邮件
第五步:异常处理,成功发送邮箱,传入redis数据库内容
@Service
public class userServiceImpl implements userService {
//UserMapping层,已实现查询
@Resource
userMapping mapping;
//邮件发送器
@Resource
MailSender mailSender;
//待定:redis处理器
@Resource
StringRedisTemplate template;
/*
1.生成对应的验证码(生成数据)
2.将邮箱和验证码以对象的形式储存
3.存储在redis里面(过期时间为60秒,)
4.将验证码发送到对应的邮箱
5.发送失败就删除存储内容
6,当用户成功时,取出数据
7. 进行验证
*/
@Override
public String sendValidateEmail(String email, String session) {
//数据搬运工,将key搬运来
String key = "email:" + session + ":" + email;
//处理数据,深加工,
if (Boolean.TRUE.equals(template.hasKey(key))) {
Long expire = Optional.ofNullable(template.getExpire(key, TimeUnit.SECONDS)).orElse(0L);
if (expire > 120)
return "请稍后再试!";
}
Random random = new Random();
int code = random.nextInt(899999) + 10000;
//调用随机方法,随机发送验证码
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom("您的邮箱");
simpleMailMessage.setTo(email);
simpleMailMessage.setSubject("您的安全验证邮件");
simpleMailMessage.setText("验证码:" + code);
try {
mailSender.send(simpleMailMessage);
template.opsForValue().set(key, String.valueOf(code), 3, TimeUnit.MINUTES);
//将值传入redis中
return "发送成功";
} catch (MailException e) {
e.printStackTrace();
return "发送失败";
}
}
}
mapper
@Mapper
public interface userMapping {
//获取数据
@Select("select * from romachen.user where username = #{message} OR email = #{message}")
userEntity userByAdmitOREmail(String message);