1. package com.rchm.util.images;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics2D;
  5. import java.awt.image.BufferedImage;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import java.io.OutputStream;
  9. import java.util.Random;
  10. import javax.imageio.ImageIO;
  11. /**
  12. * 验证码生成器
  13. */
  14. public class ValidateCode {
  15. // 图片的宽度。
  16. private int width = 160;
  17. // 图片的高度。
  18. private int height = 40;
  19. // 验证码字符个数
  20. private int codeCount = 5;
  21. // 验证码干扰线数
  22. private int lineCount = 150;
  23. // 验证码
  24. private static String code = null;
  25. // 验证码图片Buffer
  26. private BufferedImage buffImg=null;
  27. private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L',
  28. 'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','X', 'Y',
  29. 'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' };
  30. public  ValidateCode() {
  31. this.createCode();
  32. }
  33. /**
  34. *
  35. * @param width 图片宽
  36. * @param height 图片高
  37. */
  38. public  ValidateCode(int width,int height) {
  39. this.width=width;
  40. this.height=height;
  41. this.createCode();
  42. }
  43. /**
  44. *
  45. * @param width 图片宽
  46. * @param height 图片高
  47. * @param codeCount 字符个数
  48. * @param lineCount 干扰线条数
  49. */
  50. public  ValidateCode(int width,int height,int codeCount,int lineCount) {
  51. this.width=width;
  52. this.height=height;
  53. this.codeCount=codeCount;
  54. this.lineCount=lineCount;
  55. this.createCode();
  56. }
  57. public void createCode() {
  58. int x = 0,fontHeight=0,codeY=0;
  59. int red = 0, green = 0, blue = 0;
  60. x = width / (codeCount +2);//每个字符的宽度
  61. fontHeight = height - 2;//字体的高度
  62. codeY = height - 4;
  63. // 图像buffer
  64. buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
  65. Graphics2D g = buffImg.createGraphics();
  66. // 生成随机数
  67. Random random = new Random();
  68. // 将图像填充为白色
  69. g.setColor(Color.WHITE);
  70. g.fillRect(0, 0, width, height);
  71. // 创建字体
  72. ImgFontByte imgFont=new ImgFontByte();
  73. Font font =imgFont.getFont(fontHeight);
  74. g.setFont(font);
  75. for (int i = 0; i < lineCount; i++) {
  76. int xs = random.nextInt(width);
  77. int ys = random.nextInt(height);
  78. int xe = xs+random.nextInt(width/8);
  79. int ye = ys+random.nextInt(height/8);
  80. red = random.nextInt(255);
  81. green = random.nextInt(255);
  82. blue = random.nextInt(255);
  83. g.setColor(new Color(red, green, blue));
  84. g.drawLine(xs, ys, xe, ye);
  85. }
  86. // randomCode记录随机产生的验证码
  87. StringBuffer randomCode = new StringBuffer();
  88. // 随机产生codeCount个字符的验证码。
  89. for (int i = 0; i < codeCount; i++) {
  90. String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
  91. // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
  92. red = random.nextInt(255);
  93. green = random.nextInt(255);
  94. blue = random.nextInt(255);
  95. g.setColor(new Color(red, green, blue));
  96. g.drawString(strRand, (i + 1) * x, codeY);
  97. // 将产生的四个随机数组合在一起。
  98. randomCode.append(strRand);
  99. }
  100. // 将四位数字的验证码保存到Session中。
  101. code = randomCode.toString();
  102. }
  103. public void write(String path) throws IOException {
  104. OutputStream sos = new FileOutputStream(path);
  105. this.write(sos);
  106. }
  107. public void write(OutputStream sos) throws IOException {
  108. ImageIO.write(buffImg, "png", sos);
  109. sos.close();
  110. }
  111. public BufferedImage getBuffImg() {
  112. return buffImg;
  113. }
  114. public static String getCode() {
  115. return code;
  116. }
  117. }

在 servlet 中使用该类:

  1. package com.rchm.util.images;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. public class ValidateCodeServlet extends HttpServlet {
  9. private static final long serialVersionUID = 1L;
  10. protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  11. response.setContentType("image/jpeg");
  12. response.setHeader("Pragma", "no-cache");
  13. response.setHeader("Cache-Control", "no-cache");
  14. response.setDateHeader("Expires", 0);
  15. ValidateCode vCode = new ValidateCode(100,30,4,100);
  16. HttpSession session = request.getSession();
  17. session.removeAttribute("validateCode");
  18. vCode.write(response.getOutputStream());
  19. session.setAttribute("validateCode", vCode.getCode());
  20. vCode.write(response.getOutputStream());
  21. }
  22. }

在 web.xml配置Servlet访问路径:

    1. <servlet>
    2. <servlet-name>validateCodeServlet</servlet-name>
    3. <servlet-class>com.rchm.util.images.ValidateCodeServlet</servlet-class>
    4. </servlet>
    5. <servlet-mapping>
    6. <servlet-name>validateCodeServlet</servlet-name>
    7. <url-pattern>code.images</url-pattern>

Java代码随机生成图片验证码的更多相关文章

  1. python 全栈开发,Day85(Git补充,随机生成图片验证码)

    昨日内容回顾 第一部分:django相关 1.django请求生命周期 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这 ...

  2. Django登录(含随机生成图片验证码)注册实例

    登录,生成随机图片验证码 一.登录 - 随机生成图片验证码 1.随机生成验证码 Python随机生成图片验证码,需要使用PIL模块,安装方式如下: pip3 install pillow 1)创建图片 ...

  3. springboot搭建项目,实现Java生成随机图片验证码。

    这篇文章主要介绍了如何通过Java如何生成验证码并验证.验证码的作用我想必大家都知道,话不多说开始实施! 首先创建一个springboot项目以下是项目结构,内有utli工具类.存放生成图片验证码方法 ...

  4. Java生成随机图片验证码

    前台html代码 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 <div style="margin-top: 50px;&quo ...

  5. Django---登录(含随机生成图片验证码)、注册示例讲解

    登录(验证码).注册功能具体代码 # urls.py from django.contrib import admin from django.urls import path from app01 ...

  6. java代码发送邮箱验证码与qq邮箱smtp服务

    发送邮箱的类封装,在此之前需要一个jar包  javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...

  7. servletResponse 随机生成图片验证码

    /***********************************servlet页面************************************/ package response; ...

  8. java代码--------随机输出100个随机数,要求每行10个数

    总结:不敢爱你么开口 package com.sads; ///实现随机输出100个数字,数字是0到9之间,每行输出10个 public class Wss { public static void ...

  9. python 随机生成图片验证码背景RGB-浅色或者深色

    import random def random_color(is_light = True): return (random.randint(0 ,127) + int(is_light) * 12 ...

随机推荐

  1. 华东交通大学2017年ACM“双基”程序设计竞赛 1005

    Problem Description 假设你有一个矩阵,有这样的运算A^(n+1) = A^(n)*A (*代表矩阵乘法)现在已知一个n*n矩阵A,S = A+A^2+A^3+...+A^k,输出S ...

  2. ResourceBundle 读取properties文件中文乱码

    1.确认properties文件是什么编码格式,并确认文件在该格式下中文是正常显示的2.读取时候,进行转一层,先用ISO-8859-1读取字节流,然后根据properties的文件格式进行new St ...

  3. @GeneratorValue与@GenericGenerator注解使用心得

    参考博主们的 http://blog.csdn.net/tianxiezuomaikong/article/details/64930151

  4. 练习九:time.sleep方法

    让python程序暂停预定时间后再运行,需要用到time.sleep方法要求,随便写入一段代码,测试time.sleep方法 import time dict1 = {1:'a',2:'b',3:'c ...

  5. SQL Server 查看分区表(partition table)的分区范围(partition range)

    https://www.cnblogs.com/chuncn/archive/2009/02/20/1395165.html SQL Server 2005 的分区表(partition table) ...

  6. boot and loader

    boot and loader boot 程序的所有作用 清屏 将光标移到屏幕左上角 显示 Start Boot 提示信息 加载 loader 程序的代码到 0x10000 物理内存地址 将CPU的段 ...

  7. net start命令发生系统错误5和错误1058的解决方法

    net start命令用于开启服务,格式为:net start [服务名](与之对应的"net stop [服务名]"为关闭服务命令) 5是没有管理员权限,右键管理员即可 1058 ...

  8. Java排序算法(三)

    Java排序算法(三) 三.Java排序算法总结 从这三组时间复杂度对比中,可以看出,堆排序和归并排序是不管在什么情况下发挥稳定的,快速排序好的时候表现如天才,坏情况下比较差强人意,甚至在等待排序个数 ...

  9. js小数点后保留几位方法:toFixed

    (0.22223343534).toFixed(2) 结果:0.22

  10. Linux下安装JDK及相关配置

    1.官网下载JDK:选择Linux压缩包进行下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...