Java怎么生成图片验证码
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关Java怎么生成图片验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第一种方法 全是字母和数字组成package com.myFirstSpr
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
access数据库重点总结
网络技术弊端影响
如何重启domino服务器
金蝶erp服务器系统
方舟端游服务器难度
服务器磁盘阵列位置放错会怎样
首选ntp服务器地址
互联网科技工作委员会成员
无线网络安全的攻击
mes公用数据库对接
曲靖新华互联网科技哪家好
疫情期间网络安全修炼宝典
计机网络技术就业方向
软件开发环境管理制度
武汉纺织大学计算机网络技术
阿里云服务器账号名字
延庆服务器基地
软件开发一个公式多少钱
数据库软件如何工作
PICC 软件开发岗
华为网络技术大赛集体答辩
第十三章数据库技术基础
湖北it软件开发培训
sr588服务器找不到硬盘
X县网络安全宣传周情况汇报
服务器磁盘阵列位置放错会怎样
无线网络安全的攻击
卡巴斯基数据库怎么升级
access数据库 区别
项目管理网络安全图