Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to generate Picture Verification Code by Java

2025-02-24 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/03 Report--

This article is about how Java generates image CAPTCHA. The editor thinks it is very practical, so share it with you as a reference and follow the editor to have a look.

The first method is made up of letters and numbers

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 generates verification code * @ author waa * @ version V1.0, date 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" .toCharray (); private static char [] ch = "abcdefghijklmnopqrstuvwxyz0123456789" .toCharArray () Public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost (request, response);} / generate numeric and letter CAPTCHA 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); / / create image BufferedImage image = new BufferedImage (width, height, BufferedImage.TYPE_INT_RGB) in memory; / / get graphics context Graphics g = image.getGraphics (); / / generate random class Random random = new Random (); / / set background color g.setColor (getRandColor (200,250); g.fillRect (0,0, width, height) / / set the font g.setFont (new Font ("Times New Roman", Font.PLAIN, 18); / / draw the border / / g.setColor (new Color ()); / / g.drawRect (0LWH Widthly1); / / randomly generate 155interference lines so that the authentication code in the image is not easily detected by other programs g.setColor (getRandColor (160200)); 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 >

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);} / * * get the path of a class * * @ 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;}}

The second Chinese character

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 / * generate verification code (Chinese characters) * * @ author Bing Yu Ling * * / 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"); / / create cache BufferedImage bi = new BufferedImage (WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); / / get canvas Graphics g = bi.getGraphics (); / / set back shadow setBackGround (g) / / set frame setBorder (g); / draw interference line drawRandomLine (g); / write random number String random = drawRandomNum ((Graphics2D) g); / / store random Chinese characters in session request.getSession () .setAttribute ("piccode", random); / / write graphics to browser response.setContentType ("image/jpeg") / / hair control browser not to cache response.setDateHeader ("expries",-1); response.setHeader ("Cache-Control", "no-cache"); response.setHeader ("Pragma", "no-cache"); / / write pictures to browser ImageIO.write (bi, "jpg", response.getOutputStream ()) } / * set background color * * @ param g * / private void setBackGround (Graphics g) {/ / set color g.setColor (Color.WHITE); / / filled area g.fillRect (0,0, WIDTH, HEIGHT) } / * set border * * @ param g * / private void setBorder (Graphics g) {/ / set border color g.setColor (Color.BLUE); / / border area g.drawRect (1, 1, WIDTH-2, HEIGHT-2) } / * draw random lines * * @ param g * / private void drawRandomLine (Graphics g) {/ / set color g.setColor (Color.GREEN); / / set the number of lines and draw 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 >

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);} / * * get the path of a class * * @ 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;}}

Directly copying the code can test the generated method

The calling method in the previous paragraph is as follows

Function flushVerifyImg () {var timenow = new Date (). GetTime (); $("# VerifyImg") .attr ("src",'/ servlet/Validate?d=' + timenow); return false;}

Then the configuration file is configured in web.xml as follows

Validate com.myFirstSpring.util.ValidateCodeUtils Validate / servlet/Validate

The important thing is that one of your file paths needs to be configured correctly, that is, com.myFirstSpring.util.ValidateCodeUtils

Play my project configuration file again

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 Thank you for reading! This is the end of this article on "how to generate picture verification code for Java". I hope the above content can be of some help to you, so that you can learn more knowledge. if you think the article is good, you can share it out for more people to see!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report