• 跨域和验证码的实现


    一、跨域

    1、跨域请求:通过一个域的JavaScript脚本和另外一个域的内容进行交互

    2、域的信息:协议、域名、端口号

    3、同域:当两个域的协议、域名、端口号均相同

    4、解决办法

    ①在controller上添加@CrossOrigin注解

    ②添加配置类配置跨域请求

    1. @Component
    2. public class WebMvcConfiguration implements WebMvcConfigurer {
    3. @Override
    4. public void addCorsMappings(CorsRegistry registry) {
    5. registry.addMapping("/**") // 添加路径规则
    6. .allowCredentials(true) // 是否允许在跨域的情况下传递Cookie
    7. .allowedOriginPatterns("*") // 允许请求来源的域规则
    8. .allowedMethods("*")
    9. .allowedHeaders("*") ; // 允许所有的请求头
    10. }
    11. }

    二、图片验证码的后端代码实现

    1、创建实体类

    1. @Data
    2. public class ValidateCodeVo {
    3. private String codeKey ; // 验证码的key
    4. private String codeValue ; // 图片验证码对应的字符串数据
    5. }
    1. @Data
    2. public class LoginDto {
    3. private String userName ;
    4. private String password ;
    5. private String captcha ;
    6. private String codeKey ;
    7. }

    2、controller层代码

    1. @Autowired
    2. private ValidateCodeService validateCodeService;
    3. @GetMapping(value = "/generateValidateCode")
    4. public Result generateValidateCode() {
    5. ValidateCodeVo validateCodeVo = validateCodeService.generateValidateCode();
    6. return Result.build(validateCodeVo , ResultCodeEnum.SUCCESS) ;
    7. }

     3、service层代码已经进行redis缓存验证码操作

    1. public interface ValidateCodeService {
    2. // 获取验证码图片
    3. public abstract ValidateCodeVo generateValidateCode();
    4. }
    5. // com.atguigu.spzx.manager.service.impl
    6. @Service
    7. public class ValidateCodeServiceImpl implements ValidateCodeService {
    8. @Autowired
    9. private RedisTemplate redisTemplate ;
    10. @Override
    11. public ValidateCodeVo generateValidateCode() {
    12. // 使用hutool工具包中的工具类生成图片验证码
    13. //参数:宽 高 验证码位数 干扰线数量
    14. CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 20);
    15. String codeValue = circleCaptcha.getCode();
    16. String imageBase64 = circleCaptcha.getImageBase64();
    17. // 生成uuid作为图片验证码的key
    18. String codeKey = UUID.randomUUID().toString().replace("-", "");
    19. // 将验证码存储到Redis中
    20. redisTemplate.opsForValue().set("user:login:validatecode:" + codeKey , codeValue , 5 , TimeUnit.MINUTES);
    21. // 构建响应结果数据
    22. ValidateCodeVo validateCodeVo = new ValidateCodeVo() ;
    23. validateCodeVo.setCodeKey(codeKey);
    24. validateCodeVo.setCodeValue("data:image/png;base64," + imageBase64);
    25. // 返回数据
    26. return validateCodeVo;
    27. }
    28. @Override
    29. public LoginVo login(LoginDto loginDto) {
    30. // 校验验证码是否正确
    31. String captcha = loginDto.getCaptcha(); // 用户输入的验证码
    32. String codeKey = loginDto.getCodeKey(); // redis中验证码的数据key
    33. // 从Redis中获取验证码
    34. String redisCode = redisTemplate.opsForValue().get("user:login:validatecode:" + codeKey);
    35. if(StrUtil.isEmpty(redisCode) || !StrUtil.equalsIgnoreCase(redisCode , captcha)) {
    36. throw new GuiguException(ResultCodeEnum.VALIDATECODE_ERROR) ;
    37. }
    38. // 验证通过删除redis中的验证码
    39. redisTemplate.delete("user:login:validatecode:" + codeKey) ;
    40. }
    41. }

  • 相关阅读:
    TSC TTP244Pro 打码机出现的问题及解决方案
    【信息安全技术】RSA算法的研究及不同优化策略的比较
    SqlServer双机发布订阅
    JVM原理:JVM运行时内存模型(通俗易懂)
    绝区捌--将GPT幻觉的发生率从20%以上降低到2%以下
    Arduino基础入门
    juc之常用4大并发工具类 (四)
    ESP32 系列之 ESP-IDF 官方构建方案
    VUE前端实现“模糊搜索“(纯前端)
    python--操作列表
  • 原文地址:https://blog.csdn.net/weixin_62767544/article/details/133883355