xmtrock
发布于 2021-05-03 / 116 阅读
0

图片验证码的生成逻辑

用谷歌的验证码生成器工具来生成验证码

依赖:

<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>

验证码生成器配置

@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", "4");//文字间隔
        properties.put("kaptcha.image.height", "40");
        properties.put("kaptcha.image.width", "120");
        properties.put("kaptcha.textproducer.font.size", "30");
        properties.put("kaptcha.textproducer.char.length", "5");//验证码的长度

        Config config = new Config(properties);

        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        defaultKaptcha.setConfig(config);

        return defaultKaptcha;
    }
}

通过Controller控制器提供生成验证码的方法:

//把字符串code编程png图片给搞出去
@RestController
public class AuthController extends BaseController {
    @Autowired
    Producer producer;

    @GetMapping("/captcha")
    public RespBean captcha() throws IOException {
        String key = UUID.randomUUID().toString();
        String code = producer.createText();

        System.out.println("key(token): " + key + ", code(验证码): " + code);

        BufferedImage image = producer.createImage(code);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(image, "png", outputStream);

        BASE64Encoder encoder = new BASE64Encoder();
        String headStr = "data:image/png;base64,";//注意这个是图片的开头

        String base64Img = headStr + encoder.encode(outputStream.toByteArray());

        //设置redis存放验证码时间 (set名,key,code,时间秒)
        redisUtil.hset(Const.CAPTCHA_KEY, key, code, 500);

        return RespBean.succ(
                MapUtil.builder().put("token", key).put("captchaImg", base64Img).build() //注意名字与前端要保持一致哦
        );
    }
}

因为前后端分离,我们禁用了session,所以我们把验证码放在了redis中,使用一个随机字符串作为key,并传送到前端,前端再把随机字符串和用户输入的验证码提交上来,这样我们就可以通过随机字符串获取到保存的验证码和用户的验证码进行比较了是否正确了。