简单图片验证码

发布时间 2023-10-06 09:47:30作者: 天天开心1?

通过在线的产品原型我们知道管理员登录采用的是图形验证码登录,我们通过接口文档找到获取图形验证码接口

为用户微服务的/user/imageCode接口,在代码里我们使用到了google开源的验证码工具kaptcha来生成验证码,所以我们要在用户微服务,引入了kaptcha的依赖。

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

再看UserController里的逻辑

    @Autowired
    private DefaultKaptcha kaptcha;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
	/**
     * 获取图片验证码
     * @param httpServletRequest
     * @param httpServletResponse
     */
    @GetMapping("/imageCode/{clientToken}")
    public void getImageCode(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,@PathVariable String clientToken) throws IOException {
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        String createText = kaptcha.createText();//生成随机字母+数字(4位)
        BufferedImage challenge = kaptcha.createImage(createText);//根据文本构建图片
        ImageIO.write(challenge, "jpg", jpegOutputStream);
        byte[] captchaChallengeAsJpeg  = jpegOutputStream.toByteArray();
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream =
                httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
        redisTemplate.boundValueOps(clientToken).set(createText,120, TimeUnit.SECONDS);
    }

我们发现改请求会通过google开源的验证码工具kaptcha来生成验证码。

1)前端发送clientToken到后端,其中clientToken是前端自行生成的不会重复。

2)利用kaptcha生成验证码。

3)利用HttpServletResponse将生成的图片返回给前端。

4)会将生成的验证码的答案记录在redis中,其中key是前端提供的clientToken,value是验证码的答案,验证码有效期2分钟。