1.定义一个验证码工具类CaptchaUtil

package com.zzq.ams.util;import com.zzq.ams.model.CaptchaImage;import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.*;
import java.util.List;/*** @author zzq* @project ams-simple* @description 验证码工具* @date 2021/3/4 22:47*/
public class CaptchaUtil {private static final Random random = new Random();private static final int imgWidth = 412;  //图片宽度private static final int imgHeight = 150;  //图片高度private static final int fontSize = 70;  //字体大小private static final int fontSizeFloat = 10;  //字体大小浮动值private static final int lineCount = 10;  //线条数量private static final float noiseRage = 0.05f;  //噪声率private static final int charSpace = 15;  //验证码字符间距private static final int frontColor = 220;  //前景色RGB值private static final int frontColorFloat = 20;  //前景色浮动值private static final int backColor = 100;   //背景色RGB值private static final int backColorFloat = 20;  //背景色浮动值private static final int minCodeLen = 4;  //最短验证码字符数private static final int maxCodeLen = 5;  //最长验证码字符数private static final Character[] charArr;  //验证码基础字符数组private static final String[] fontNameArr;  //字体名称数组static {//默认字体List<String> fontNames = new ArrayList<>();fontNames.add("Cambria");fontNames.add("Arial");fontNames.add("Comic Sans MS");fontNames.add("Consolas");fontNames.add("Lucida Console");fontNames.add("Microsoft YaHei UI");fontNames.add("Segoe Print");//集合转数组fontNameArr = new String[fontNames.size()];fontNames.toArray(fontNameArr);//基础字符数组[0-9a-zA-Z]charArr = new Character[62];int i = 0;for (char j = '0'; j <= '9'; j++) {charArr[i++] = j;}for (char j = 'a'; j <= 'z'; j++) {charArr[i++] = j;}for (char j = 'A'; j <= 'Z'; j++) {charArr[i++] = j;}//数组转集合List<Character> characterList = Arrays.asList(charArr);//集合洗牌Collections.shuffle(characterList);//集合转数组characterList.toArray(charArr);}/*** 获取验证码** @return 图片验证码*/public static CaptchaImage getCaptchaImage() {BufferedImage image = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_BGR);Graphics graph = image.getGraphics();//设置背景graph.setColor(getRandColor(frontColor, frontColorFloat));  //背景色graph.fillRect(0, 0, imgWidth, imgHeight);  //填充矩形尺寸//设置字体Font font = getRandFont(fontSize, fontSizeFloat);graph.setFont(font);//绘制干扰线drawRandLine(graph, lineCount, imgWidth, imgHeight);//添加噪点addNoisePoint(image, noiseRage, imgWidth, imgHeight);//绘制字符String code = getRandChars(minCodeLen, maxCodeLen);drawCaptcha(graph, code);return CaptchaImage.of(code, image);}/*** 绘制验证码** @param graph   图像* @param captcha 验证码*/private static void drawCaptcha(Graphics graph, String captcha) {char[] charArr = captcha.toCharArray();for (int i = 0; i < charArr.length; i++) {Font font = getRandFont(fontSize, fontSizeFloat);int bottom = imgHeight - font.getSize();  //底部距离graph.setColor(getRandColor(backColor, backColorFloat));graph.drawString(String.valueOf(charArr[i]), i * font.getSize() + charSpace, bottom);}}/*** 添加图片噪点** @param image     图片* @param noiseRate 噪声率*/private static void addNoisePoint(BufferedImage image, float noiseRate, int imgWidth, int imgHeight) {int area = (int) (noiseRate * imgWidth * imgHeight);for (int i = 0; i < area; i++) {int x = random.nextInt(imgWidth);int y = random.nextInt(imgHeight);int rgb = random.nextInt(256);image.setRGB(x, y, rgb);}}/*** 绘制随机线条** @param graph     图像* @param lineCount 线条数* @param imgWidth  图片宽度* @param imgHeight 图片高度*/private static void drawRandLine(Graphics graph, int lineCount, int imgWidth, int imgHeight) {for (int i = 0; i < lineCount; i++) {int x1 = random.nextInt(imgWidth);int y1 = random.nextInt(imgHeight);int x2 = random.nextInt(imgWidth);int y2 = random.nextInt(imgHeight);graph.setColor(getRandColor(50, 30));graph.drawLine(x1, y1, x2, y2);}}/*** 生成随机字体** @param size       字体最小size* @param floatValue 浮动值* @return 字体对象*/private static Font getRandFont(int size, int floatValue) {int minFontSize = size - floatValue;int maxFontSize = size + floatValue;String fontName = fontNameArr[random.nextInt(fontNameArr.length)];int fontStyle = random.nextInt(3);int fontSize = random.nextInt(maxFontSize - minFontSize + 1) + minFontSize;return new Font(fontName, fontStyle, fontSize);}/*** 生成随机颜色** @param rgbVal   颜色基本值* @param floatVal 浮动值* @return 颜色对象*/private static Color getRandColor(int rgbVal, int floatVal) {if (rgbVal > 255) {rgbVal = 255;}int min = rgbVal - floatVal;if (min < 0) {min = 0;}int max = rgbVal + floatVal;if (max > 255) {max = 255;}int r = random.nextInt(max - min + 1) + min;int g = random.nextInt(max - min + 1) + min;int b = random.nextInt(max - min + 1) + min;return new Color(r, g, b);}/*** 生成随机字符串** @param minLen 最小长度* @param maxLen 最大长度* @return 字符串*/private static String getRandChars(int minLen, int maxLen) {int len = random.nextInt(maxLen - minLen + 1) + minLen;char[] randCharArr = new char[len];for (int j = 0; j < len; j++) {randCharArr[j] = charArr[random.nextInt(62)];  //26*2+10}return String.valueOf(randCharArr);}
}

2.配置图片消息转换器

/*** @author zzq* @project ams-simple* @description mvc配置* @date 2021/3/4 1:00*/@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {//注册图片消息转换器converters.add(new BufferedImageHttpMessageConverter());}
}

3.Controller代码

@RequestMapping("/login")
@Controller
public class LoginController extends BaseController {@RequestMapping(value = "/captcha", produces = MediaType.IMAGE_JPEG_VALUE)@ResponseBodypublic BufferedImage captcha(HttpServletResponse response) {//获取验证码图片CaptchaImage captchaImage = CaptchaUtil.getCaptchaImage();//获取验证码String code = captchaImage.getCode();System.err.println(code);//通知浏览器不缓存response.setHeader("cache-control","no-store");return captchaImage.getImage();}
}

4.页面部分代码

    <div class="layui-form-item"><label class="layui-icon layui-icon-vercode" for="captcha"></label><input type="text" id="captcha" name="captcha" lay-verify="required|captcha" placeholder="图形验证码"autocomplete="off" class="layui-input verification captcha" value="xszg"><div class="captcha-img"><img id="captchaPic" src=""></div></div>
     //JS:点击切换验证码图片$("#captchaPic").click(function () {$(this).attr("src", "/login/captcha");});

5.几张效果图


SpringBoot后端生成漂亮美观的验证码图片相关推荐

  1. 用Python生成随机的中文验证码图片

    大家都在 Python论坛里讨论.交流,你还在等什么!赶快加入! 在登录很多网站的时候,他们已经不在使用简单的英文和数字的验证码,为了防止恶心注册和群发软件的侵袭,现在都开始使用中文的验证码了. 今天 ...

  2. 生成最简单的验证码图片的Java代码

    后端代码: package priv.lwx.servlet.sl.web; /*** description** @author liaowenxiong* @date 2022/3/25 09:5 ...

  3. 转: 通过Servlet生成验证码图片

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(九)-- 通过Servlet生成验证码图片 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedIma ...

  4. Java Web学习总结(6)——通过Servlet生成验证码图片

    2019独角兽企业重金招聘Python工程师标准>>> 一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawIma ...

  5. javaweb学习总结(九):通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.r ...

  6. 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.res ...

  7. 通过Servlet生成验证码图片 (转孤傲苍狼)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.r ...

  8. javaweb(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.r ...

  9. avaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.r ...

最新文章

  1. C++Doubly Linked List双向链表(附完整源码)
  2. JavaScript中带有示例的Math.PI属性
  3. 21.和和instance of
  4. 在吗,支付宝土味情歌撩到你了吗?网友:撩到了,好酸
  5. 新春牛年迎春PSD分层模板!最全设计素材都在这了
  6. 做自媒体最重要的是坚持,但你坚持后还是一无所获
  7. 13 张图彻底搞懂分布式系统服务注册与发现原理
  8. mysql主从复制巡检脚本_mysql主从复制监控shell脚本
  9. 【矢量图】PyEcharts导出图片并矢量化
  10. linux中添加程序,学习进阶 uClinux中添加用户应用程序
  11. 类和结构体的内存空间占有问题
  12. 在ubuntu18.04系统上使用ROS跑ORB-SLAM3时遇到的问题总结
  13. [毅周总结]数据结构(1)
  14. mysql数据库热备份_mysql数据库热备份
  15. 2022年P气瓶充装考试试题及答案
  16. 全球与中国汽车线性稳压器市场运营态势及产销需求预测报告2022-2028年版
  17. python区间分布统计_常见概率统计分布及Python实现
  18. 常见操作系统命令注入思路
  19. 'Webdings' 的字体对照表
  20. Teradata和Exadata

热门文章

  1. AWS S3 挂载到EC2
  2. 使用SuperMap iDesktopX如何去掉“耗子尾巴”
  3. git提交用户名与当前用户名不止一致(或者邮箱)
  4. 动态磁盘转化为基本磁盘
  5. 玩了一下 SAP Fiori ABAP编程模型
  6. 下载apk到本地,安装遇到的解析包时出现错误的分析
  7. k1658停运_2020厦门停运动车车次整理
  8. wps html编辑表格,手机版wps如何编辑表格图解
  9. 【附源码】计算机毕业设计java智慧校园防疫管理平台设计与实现
  10. 【目标检测·yolo系列】YOLOV1目标检测论文(参考 同济子豪兄的解读)笔记