龙空技术网

「Java工具类」验证码工具类java生成验证码工具类

程序员阿宁 937

前言:

今天同学们对“java图片验证码工具类”大致比较关心,各位老铁们都需要了解一些“java图片验证码工具类”的相关知识。那么小编在网摘上汇集了一些有关“java图片验证码工具类””的相关内容,希望咱们能喜欢,咱们一起来学习一下吧!

介绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

在登录中页面为什么需要一个验证码?装比呗,哈哈哈。你信吗?我整理了下自己用的验证码工具类,码友们可以直接使用,也可以进一步改进优化,再用于自己的项目中。

程序员不会表达,直接上干货把。

使用例子1

直接保存验证码图片到本地

使用例子2

模拟浏览器获取验证码和校验验证码

工具类源码:

 import org.slf4j.Logger; import org.slf4j.LoggerFactory;  import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Random;  /**  * 验证码工具类  *  * @author liangxn  */ public class VerifyCodeUtil {      private static final Logger LOGGER = LoggerFactory.getLogger(VerifyCodeUtil.class);     private final int width = 200;     private final int height = 80;     private BufferedImage codeImg;     private final StringBuilder sb = new StringBuilder();     private final Random random = new Random();     private final Color bgColor = new Color(255, 255, 255);     private final String[] fontsName = {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"};      /**      * 生成code(第一步调用)      */     public void generateCode(){         codeImg = addCharAndLine();     }      /**      * 获取验证码的值      *      * @return      */     public String getText() {         return sb.toString();     }      /**      * 直接将验证码返回到浏览器      *      * @param response      */     public void writeCodeToRespone(HttpServletResponse response) {         try {             // 设置输出流             response.setContentType("image/jpeg");             response.setHeader("Pragma", "No-cache");             response.setHeader("Cache-Control", "no-cache");             response.setDateHeader("Expire", 0);             // 写入输出流中             ImageIO.write(codeImg, "JPEG", response.getOutputStream());         } catch (FileNotFoundException e) {             LOGGER.error("文件未发现异常", e);         } catch (IOException e) {             LOGGER.error("写验证码异常", e);         }     }      /**      * 生产验证码图片      *      * @return      */     public void createVerifyCode(String imageName) {         String path = imageName + ".jpg";         try {             ImageIO.write(codeImg, "JPEG", new FileOutputStream(path));         } catch (FileNotFoundException e) {             LOGGER.error("文件未发现异常", e);         } catch (IOException e) {             LOGGER.error("写验证码异常", e);         }     }      /**      * 获取字体      *      * @return      */     private String getFont() {         int index = random.nextInt(fontsName.length);         return fontsName[index];     }      /**      * 获取随机字符      *      * @return      */     private String getChar() {         String codes = "0123456789abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";         int index = random.nextInt(codes.length());         return codes.charAt(index) + "";     }      /**      * 获取字体颜色      *      * @return      */     private Color getColor() {         int red = random.nextInt(150);         int green = random.nextInt(150);         int blue = random.nextInt(150);         return new Color(red, green, blue);     }      /**      * 生成图片缓存      *      * @return      */     private BufferedImage getBufferedImage() {         BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);         Graphics2D pen = (Graphics2D) bi.getGraphics();         pen.setColor(this.bgColor);         pen.fillRect(0, 0, width, height);         return bi;     }      /**      * 给验证码图片画字符和干扰线(包含有字符和线)      *      * @return      */     private BufferedImage addCharAndLine() {         BufferedImage bi = getBufferedImage();         Graphics2D pen = (Graphics2D) bi.getGraphics();         // 把验证码画到图片上         for (int i = 0; i < 4; i++) {             String font = getFont();             // 生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)             int style = random.nextInt(4);             pen.setColor(getColor());             int fontSize = 70;             pen.setFont(new Font(font, style, fontSize));             String s = getChar();             sb.append(s);             pen.drawString(s, 10 + i * 50, 65);         }          // 画3条干扰线         int lineNumber = 3;         pen.setColor(Color.BLUE);         pen.setStroke(new BasicStroke(1.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));         for (int i = 0; i < lineNumber; i++) {             int x1 = random.nextInt(width);             int y1 = random.nextInt(height);             int x2 = random.nextInt(width);             int y2 = random.nextInt(height);             pen.drawLine(x1, y1, x2, y2);         }         return bi;     } }

鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

标签: #java图片验证码工具类