Java怎么生成图片验证码
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关Java怎么生成图片验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一种方法 全是字母和数字组成package com.myFirstSpr
千家信息网最后更新 2026年11月01日Java怎么生成图片验证码
这篇文章给大家分享的是有关Java怎么生成图片验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
第一种方法 全是字母和数字组成
package com.myFirstSpring.util; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random; import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * * @Description 生成验证码 * @author waa * @version V1.0, 日期2011-7-4 */public class ValidateCodeUtils extends HttpServlet { private static final long serialVersionUID = -1409007752285164213L; private static int width = 75; private static int height = 35; // private static char[] ch = // "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789".toCharArray(); private static char[] ch = "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } // 生成数字和字母的验证码 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/jpeg"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 画边框 // g.setColor(new Color()); // g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(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); } // 取随机产生的认证码(4位数字) StringBuffer sb = new StringBuffer(); int index, len = ch.length; for (int i = 0; i < 4; i++) { index = random.nextInt(len); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 28));// 输出的字体和大小 g.drawString("" + ch[index], (i * 15) + 6, 26);// 写什么数字,在图片的什么位置画 sb.append(ch[index]); } // 将认证码存入SESSION request.getSession().setAttribute("piccode", sb.toString()); request.getSession().setAttribute(request.getSession().getId(), sb.toString()); // 图象生效 g.dispose(); ServletOutputStream responseOutputStream = response.getOutputStream(); // 输出图象到页面 ImageIO.write(image, "JPEG", responseOutputStream); // 以下关闭输入流! responseOutputStream.flush(); responseOutputStream.close(); } protected void ValidateCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 在内存中创建图象 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 得到该图片的绘图对象 Graphics g = img.getGraphics(); Random r = new Random(); Color c = new Color(200, 150, 255); g.setColor(c); // 填充整个图片的颜色 g.fillRect(0, 0, width, height); // 向图片中输出数字和字母 StringBuffer sb = new StringBuffer(); int index, len = ch.length; for (int i = 0; i < 4; i++) { index = r.nextInt(len); g .setColor(new Color(r.nextInt(88), r.nextInt(188), r .nextInt(255))); g.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 22));// 输出的字体和大小 g.drawString("" + ch[index], (i * 15) + 6, 18);// 写什么数字,在图片的什么位置画 sb.append(ch[index]); } request.getSession().setAttribute("piccode", sb.toString()); ServletOutputStream responseOutputStream = response.getOutputStream(); ImageIO.write(img, "JPG", responseOutputStream); responseOutputStream.flush(); responseOutputStream.close(); } 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); } /** * 得到某一个类的路径 * * @param name * @return */ public static String getPath(Class name) { String strResult = null; if (System.getProperty("os.name").toLowerCase().indexOf("window") > -1) { strResult = name.getResource("/").toString().replace("file:/", "") .replace("%20", " "); } else { strResult = name.getResource("/").toString().replace("file:", "") .replace("%20", " "); } return strResult; }}第二种 中文字符
package com.myFirstSpring.util; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random; import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * 生成验证码(汉字) * * @author 冰雨凌風 * */public class ValidateCodeUtils_zh extends HttpServlet { /** * */ private static final long serialVersionUID = 6699312412706395069L; public static final int WIDTH = 120; public static final int HEIGHT = 30; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); // 创建缓存 BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 获得画布 Graphics g = bi.getGraphics(); // 设置背影色 setBackGround(g); // 设置边框 setBorder(g); // 画干扰线 drawRandomLine(g); // 写随机数 String random = drawRandomNum((Graphics2D) g); // 将随机汉字存在session中 request.getSession().setAttribute("piccode", random); // 将图形写给浏览器 response.setContentType("image/jpeg"); // 发头控制浏览器不要缓存 response.setDateHeader("expries", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); // 将图片写给浏览器 ImageIO.write(bi, "jpg", response.getOutputStream()); } /** * 设置背景色 * * @param g */ private void setBackGround(Graphics g) { // 设置颜色 g.setColor(Color.WHITE); // 填充区域 g.fillRect(0, 0, WIDTH, HEIGHT); } /** * 设置边框 * * @param g */ private void setBorder(Graphics g) { // 设置边框颜色 g.setColor(Color.BLUE); // 边框区域 g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2); } /** * 画随机线条 * * @param g */ private void drawRandomLine(Graphics g) { // 设置颜色 g.setColor(Color.GREEN); // 设置线条个数并画线 for (int i = 0; i < 5; i++) { int x1 = new Random().nextInt(WIDTH); int y1 = new Random().nextInt(HEIGHT); int x2 = new Random().nextInt(WIDTH); int y2 = new Random().nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } /** * 画随机汉字 * * @param g * @return */ private String drawRandomNum(Graphics2D g) { StringBuffer sb = new StringBuffer(); // 设置颜色 g.setColor(Color.RED); // 设置字体 g.setFont(new Font("宋体", Font.BOLD, 20)); // 准备常用汉字集 String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; int x = 5; // 控制字数 for (int i = 0; i < 4; i++) { // 设置字体旋转角度 int degree = new Random().nextInt() % 30; // 截取汉字 String ch = base.charAt(new Random().nextInt(base.length())) + ""; sb.append(ch); // 正向角度 g.rotate(degree * Math.PI / 180, x, 20); g.drawString(ch, x, 20); // 反向角度 g.rotate(-degree * Math.PI / 180, x, 20); x += 30; } return sb.toString(); }}第三种 加减乘除方式
package com.myFirstSpring.util; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random; import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; /** * * @Description 生成验证码(加减乘) * @author waa * @version V1.0, 日期2011-7-4 */public class ValidateCodeUtils_algorithm extends HttpServlet { private static final long serialVersionUID = -1409007752285164213L; private static int width = 75; private static int height = 35; // private static char[] ch = // "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789".toCharArray(); private static char[] ch = "0123456789".toCharArray(); private static char[] sf = "+-x".toCharArray(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } // 生成数字和字母的验证码 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("image/jpeg"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 在内存中创建图象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 画边框 // g.setColor(new Color()); // g.drawRect(0,0,width-1,height-1); // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(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); } // 取随机产生的认证码(4位数字) StringBuffer sb = new StringBuffer(); int index, len = ch.length; index = random.nextInt(len); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 20));// 输出的字体和大小 g.drawString("" + ch[index], (0 * 15), 26);// 写什么数字,在图片的什么位置画 sb.append(ch[index]); int index1, len1 = sf.length; index1 = random.nextInt(len1); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 20));// 输出的字体和大小 g.drawString("" + sf[index1], (1 * 15), 26);// 写什么数字,在图片的什么位置画 sb.append(sf[index1]); int index2, len2 = ch.length; index2 = random.nextInt(len2); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 20));// 输出的字体和大小 if(String.valueOf(sf[index1]).equals("-")){ if(Integer.parseInt(String.valueOf(ch[index])) < Integer.parseInt(String.valueOf(ch[index2]))){ index2 = index; } } g.drawString("" + ch[index2], (2 * 15) , 26);// 写什么数字,在图片的什么位置画 sb.append(ch[index2]); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 20));// 输出的字体和大小 g.drawString("=", (3 * 15) , 26);// 写什么数字,在图片的什么位置画 sb.append("="); g.setColor(new Color(random.nextInt(88), random.nextInt(188), random.nextInt(255))); g.setFont(new Font("Arial", Font.ITALIC, 20));// 输出的字体和大小 g.drawString("?", (4 * 15) , 26);// 写什么数字,在图片的什么位置画 sb.append("?"); g.drawLine(5, 3, 60, 35); // 将认证码存入SESSION int jg = 0; if(String.valueOf(sf[index1]).equals("+")){ jg = Integer.parseInt(String.valueOf(ch[index])) + Integer.parseInt(String.valueOf(ch[index2])); } if(String.valueOf(sf[index1]).equals("-")){ jg = Integer.parseInt(String.valueOf(ch[index])) - Integer.parseInt(String.valueOf(ch[index2])); } if(String.valueOf(sf[index1]).equals("x")){ jg = Integer.parseInt(String.valueOf(ch[index])) * Integer.parseInt(String.valueOf(ch[index2])); } request.getSession().setAttribute("piccode", String.valueOf(jg)); request.getSession().setAttribute(request.getSession().getId(), sb.toString()); // 图象生效 g.dispose(); ServletOutputStream responseOutputStream = response.getOutputStream(); // 输出图象到页面 ImageIO.write(image, "JPEG", responseOutputStream); // 以下关闭输入流! responseOutputStream.flush(); responseOutputStream.close(); } protected void ValidateCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 在内存中创建图象 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 得到该图片的绘图对象 Graphics g = img.getGraphics(); Random r = new Random(); Color c = new Color(200, 150, 255); g.setColor(c); // 填充整个图片的颜色 g.fillRect(0, 0, width, height); // 向图片中输出数字和字母 StringBuffer sb = new StringBuffer(); int index, len = ch.length; for (int i = 0; i < 4; i++) { index = r.nextInt(len); g .setColor(new Color(r.nextInt(88), r.nextInt(188), r .nextInt(255))); g.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 22));// 输出的字体和大小 g.drawString("" + ch[index], (i * 15) + 6, 18);// 写什么数字,在图片的什么位置画 sb.append(ch[index]); } request.getSession().setAttribute("piccode", sb.toString()); ServletOutputStream responseOutputStream = response.getOutputStream(); ImageIO.write(img, "JPG", responseOutputStream); responseOutputStream.flush(); responseOutputStream.close(); } 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); } /** * 得到某一个类的路径 * * @param name * @return */ public static String getPath(Class name) { String strResult = null; if (System.getProperty("os.name").toLowerCase().indexOf("window") > -1) { strResult = name.getResource("/").toString().replace("file:/", "") .replace("%20", " "); } else { strResult = name.getResource("/").toString().replace("file:", "") .replace("%20", " "); } return strResult; }}直接复制代码可以测试生成的方法
前段调用方法如下所示
function flushVerifyImg() { var timenow = new Date().getTime(); $("#VerifyImg").attr("src", '/servlet/Validate?d=' + timenow); return false;}然后是配置文件 在web.xml配置如下
Validate com.myFirstSpring.util.ValidateCodeUtils Validate /servlet/Validate
其中重要的是一个你的文件路径需要配置正确 就是com.myFirstSpring.util.ValidateCodeUtils
在放一下我的项目配置文件
CoBiker encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter * org.springframework.web.context.ContextLoaderListener action org.springframework.web.servlet.DispatcherServlet 1 action / Validate com.myFirstSpring.util.ValidateCodeUtils Validate /servlet/Validate index.ftl 404 /WEB-INF/view/404.ftl 500 /index.ftl BASIC
感谢各位的阅读!关于"Java怎么生成图片验证码"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
图片
数字
生成
图象
字体
输出
验证
位置
大小
边框
颜色
认证
字母
汉字
内存
中创
配置
图形
文件
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手磨咖啡
小米移动互联网科技园
有格互联网科技
互联网科技图片
互联网佳科技有限公司
互联网最新的科技
互联网下的科技发展
互联网与未来科技
上海致骋互联网科技
碳银互联网科技有限公司
互联网科技大会
卫星互联网科技股票
受益于互联网科技的高速发展
宁夏科技产业互联网案例
科技赋能视角下互联网保险发展
互联网第三次科技革命特征
富国互联网金融科技混合基金
互联网科技创业计划的风险分析
互联网科技快速发展优美句子
广州全民伙伴互联网科技有限公司
新华互联网科技学院
互联网 科技
互联网科技视频
互联网科技上市公司
佰商互联网科技有限公司
天扬科技互联网广告
北京三清互联网科技
广州慧亚互联网科技怎么样
玉溪互联网科技怎么选
山东子淼互联网科技有限公司