JAVA生成图形验证码

JAVA生成图形验证码

在这里插入图片描述


创建实体类,图片通过BASE64返回给前端
@Data
public class VerifyDTO {
    private String verifyString;
    private String verifyBase64;
    private String key;
}

创建接口
	@GetMapping("/get-verify")
    @ApiOperation(value = GET_VERIFY, notes = GET_VERIFY)
    @ApiResponses({
            @ApiResponse(code = 1, message = ErrorMsgConstant.SUCCESS)
    })
    public ResponseEntity<CaptchaVO> getVerify() {
        log.info("start get verify");
        VerifyDTO dto = VerifyUtil.getRandCode();
        redisService.setValueByMinutes(dto.getKey(), dto.getVerifyString(), 5L);
        return ResponseEntity.ok(CaptchaVO.builder()
                .imgBase64(dto.getVerifyBase64())
                .key(dto.getKey())
                .build());
    }

Util类
@Slf4j
public class VerifyUtil {
    /**
     * 随机产生数字与字母组合的字符串
     */
    private static final String RAND_STRING = "0123456789";

    /**
     * 图片宽
     */
    private static final int WIDTH = 95;

    /**
     * 图片高
     */
    private static final int HEIGHT = 25;

    /**
     * 随机产生字符数量
     */
    private static final int STRING_NUM = 4;

    private static final Random RANDOM = new Random();

    /**
     * 获得字体
     */
    private static Font getFont() {
        return new Font("Fixedsys", Font.BOLD, 18);
    }


    public static VerifyDTO getRandCode() {
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);

        //产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        Graphics2D g =  image.createGraphics();
        g.setBackground(new Color(106, 175, 243));
        //图片大小
        g.fillRect(0, 0, WIDTH, HEIGHT);
        //字体大小
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        //字体颜色
        g.setColor(new Color(114, 151, 232));

        // 绘制随机字符
        String randomString = "";
        for (int i = 1; i <= STRING_NUM; i++) {
            randomString = drawString(g, randomString, i);
        }
        g.dispose();

        VerifyDTO vo = new VerifyDTO();
        vo.setVerifyBase64(bufferedImageToBase64(image));
        vo.setKey(UUID.randomUUID().toString());
        vo.setVerifyString(randomString);
        return vo;
    }

    private static String bufferedImageToBase64(BufferedImage bufferedImage) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        try {
            ImageIO.write(bufferedImage, "png", stream);
        } catch (IOException e) {
            throw new ServiceException("验证码生成异常");
        }
        Base64 base = new Base64();
        String base64 = base.encodeToString(stream.toByteArray());
        return "data:image/png;base64," + base64;
    }

    /**
     * 绘制字符串
     */
    private static String drawString(Graphics2D g, String randomString, int i) {
        g.setFont(getFont());
        g.setColor(new Color(54,141,255));
        String rand = getRandomString(RANDOM.nextInt(RAND_STRING
                .length()));
        randomString += rand;
        g.translate(RANDOM.nextInt(3), RANDOM.nextInt(3));
        g.drawString(rand, 13 * i, 16);
        return randomString;
    }

    /**
     * 获取随机的字符
     */
    public static String getRandomString(int num) {
        return String.valueOf(RAND_STRING.charAt(num));
    }
}

调接口获取验证码

在这里插入图片描述


复制到浏览器,验证图片,END

在这里插入图片描述


请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值