欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

前后端分离验证码方案

程序员文章站 2024-03-20 21:32:16
...

前后端分离的验证码解决方案:::

逻辑是这样:
  前后端分离 登录验证码 方案
  后端生成图片 验证码字符串 uuid
  uuid为key  验证码字符串为value
  传递bs64图片 和uuid给前端
  前端在登录的时候 传递 账号 密码 验证码 uuid
  通过uuid获取 验证码 验证
 
<!-- 验证码生成包-->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

/**
 * @author wl
 * @date 2019-4-23
 * 生成验证码的配置
 */
@Configuration
public class KaptchaConfig {
    @Bean
    public DefaultKaptcha producer(){
        Properties properties = new Properties();
        properties.put("kaptcha.border", "no");
        properties.put("kaptcha.textproducer.font.color", "black");
        properties.put("kaptcha.textproducer.char.space", "10");
        properties.put("kaptcha.textproducer.char.length","4");
        properties.put("kaptcha.image.height","34");
        properties.put("kaptcha.textproducer.font.size","25");

        properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
        Config config = new Config(properties);
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}
    @Autowired
    private DefaultKaptcha producer;
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @ResponseBody
    @PostMapping("/captcha")
    public Result captcha()throws IOException {
        /**
         * 前后端分离 登录验证码 方案
         * 后端生成图片 验证码字符串 uuid
         * uuid为key  验证码字符串为value
         * 传递bs64图片 和uuid给前端
         * 前端在登录的时候 传递 账号 密码 验证码 uuid
         * 通过uuid获取 验证码 验证
         */
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        //获取验证码
        String text = producer.createText();
        logger.info("登录验证码:"+text);

        BufferedImage image = producer.createImage(text);
        ImageIO.write(image, "png", out);
        String base64bytes = Base64.encode(out.toByteArray());

        //该字符串传输至前端放入src即可显示图片,安卓可以去掉data:image/png;base64,
        String src = "data:image/png;base64," + base64bytes;

        String token = UUID.randomUUID().toString();
        Map<String, Object> map = new HashMap<>(2);
        map.put("token", token);
        map.put("img", src);
        stringRedisTemplate.opsForValue().set(token, text);
        return Result.succeed(map);
    }

 

相关标签: java