废话不多说,直接上代码!
/**
* @Description: 获取验证码图片
* @params
* @Author: czw
* @return
* @CreateDate: 2021/3/1 10:32
*/
@RequestMapping("/get_verify_code")
@ResponseBody
public void getVerifyCode(String uuid, HttpServletResponse response) throws IOException {
int width = 120; // 验证码图片宽度
int height = 40; // 验证码图片长度
int length = 4; // 验证码位数
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(VerifyCodeUtil.getRandColor(185, 250));
g.fillRect(0, 0, width, height);
g.setFont(new Font("Times New Roman", Font.ITALIC, 35));
g.setColor(VerifyCodeUtil.getRandColor(160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
StringBuilder sRand = new StringBuilder();
for (int i = 0; i < length; i++) {
String rand = String.valueOf(VerifyCodeUtil.getRandomString(random.nextInt(VerifyCodeUtil.randString.length())));
sRand.append(rand);
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(rand, 25 * i + 12, 32);
}
//7.将随机验证码存入redis缓存并设置过期时间,设置过期时间20分钟
stringRedisTemplate.opsForValue().set(uuid,sRand.toString(),60 * 20,TimeUnit.SECONDS);
//8.设置响应头通知浏览器以图片的形式打开
response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg");
//9.设置响应头控制浏览器不要缓存
response.setDateHeader("expries", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
//10.将图片写给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
}
上工具类
/**
* @author czw
* @version 1.0
* @date 2021/3/1 9:31
* @remark 生成验证码工具类
*/
public class VerifyCodeUtil {
public static String randString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机字符串
/**
* 获取随机的字符
*/
public static String getRandomString(int num) {
return String.valueOf(randString.charAt(num));
}
/**
* 获取颜色
*/
public static Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
效果图如下