package xin.merlin.myblog_server.controller; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import xin.merlin.myblog_server.entity.Code; import xin.merlin.myblog_server.entity.User; import xin.merlin.myblog_server.service.CacheService; import xin.merlin.myblog_server.service.impl.MailService; import xin.merlin.myblog_server.utils.RandomCode; import xin.merlin.myblog_server.utils.RequestBack; import xin.merlin.myblog_server.utils.enums.ResultCode; import java.util.Map; import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/code") public class MailController { @Autowired private CacheService cacheService; // 冷却缓存:限制邮箱请求频率 private static final Cache emailCooldown = Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.SECONDS) // 冷却 60 秒 .build(); // 验证码验证次数 private static final Cache codeFailCount = Caffeine.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .build(); @Autowired private MailService mailService; @PostMapping("/sendcode") RequestBack sendcode(@RequestBody User user) { if (user.getAccount() == null) return RequestBack.fail(ResultCode.BAD_REQUEST); System.out.println("发送验证码到:" + user.getAccount()); String email = user.getAccount(); // 检查是否在冷却中 if (emailCooldown.getIfPresent(email) != null) { return RequestBack.fail(ResultCode.USER_SEND_TOO_FAST); } String tempId; do { tempId = RandomCode.generateCode(); } while (cacheService.getWaitingList().getIfPresent(tempId) != null); try { cacheService.getWaitingList().put(tempId, mailService.sendMail(user.getAccount())); // 加入验证码冷却 emailCooldown.put(user.getAccount(), true); return RequestBack.success(ResultCode.SUCCESS, Map.of("c_id", tempId)); } catch (Exception e) { return RequestBack.fail(ResultCode.SERVER_ERROR); } } @PostMapping("/verifycode") RequestBack verifyCode(@RequestBody Code code) { //测试验证码 String id=code.getC_id(); if(codeFailCount.getIfPresent(id) == null) codeFailCount.put(id, 1); else if(codeFailCount.getIfPresent(id)<=5){ Integer time = codeFailCount.getIfPresent(id); codeFailCount.put(id, ++time); }else{ return RequestBack.fail(ResultCode.USER_SEND_TOO_OFTEN); } String tempCode = cacheService.getWaitingList().getIfPresent(id); System.out.println("cacheService.getWaitingList()" + tempCode + "\nv_id:" + id + "\ncode:" + code.getCode()); if (tempCode == null) return RequestBack.success(ResultCode.USER_VERIFICATION_ERROR); if (!tempCode.equals(code.getCode())) return RequestBack.success(ResultCode.USER_VERIFICATION_ERROR); // cacheService.getWaitingList().invalidate(id); codeFailCount.invalidate(id); emailCooldown.invalidate(code.getAccount()); return RequestBack.success(ResultCode.SUCCESS); } }