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);
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