转载自   java图形验证码生成工具类

生成验证码效果

 

 

 

ValidateCode.java 验证码生成类

package cn.dsna.util.images;  import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;  import javax.imageio.ImageIO;
/** * 验证码生成器 * @author dsna * */
public class ValidateCode {  // 图片的宽度。  private int width = 160;  // 图片的高度。  private int height = 40;  // 验证码字符个数  private int codeCount = 5;  // 验证码干扰线数  private int lineCount = 150;  // 验证码  private String code = null;  // 验证码图片Buffer  private BufferedImage buffImg=null;  private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  'K', 'L', 'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',  'X', 'Y', 'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' };  public  ValidateCode() {  this.createCode();  }  /** *  * @param width 图片宽 * @param height 图片高 */  public  ValidateCode(int width,int height) {  this.width=width;  this.height=height;  this.createCode();  }  /** *  * @param width 图片宽 * @param height 图片高 * @param codeCount 字符个数 * @param lineCount 干扰线条数 */  public  ValidateCode(int width,int height,int codeCount,int lineCount) {  this.width=width;  this.height=height;  this.codeCount=codeCount;  this.lineCount=lineCount;  this.createCode();  }  public void createCode() {  int x = 0,fontHeight=0,codeY=0;  int red = 0, green = 0, blue = 0;  x = width / (codeCount +2);//每个字符的宽度  fontHeight = height - 2;//字体的高度  codeY = height - 4;  // 图像buffer  buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  Graphics2D g = buffImg.createGraphics();  // 生成随机数  Random random = new Random();  // 将图像填充为白色  g.setColor(Color.WHITE);  g.fillRect(0, 0, width, height);  // 创建字体  ImgFontByte imgFont=new ImgFontByte();  Font font =imgFont.getFont(fontHeight);  g.setFont(font);  for (int i = 0; i < lineCount; i++) {  int xs = random.nextInt(width);  int ys = random.nextInt(height);  int xe = xs+random.nextInt(width/8);  int ye = ys+random.nextInt(height/8);  red = random.nextInt(255);  green = random.nextInt(255);  blue = random.nextInt(255);  g.setColor(new Color(red, green, blue));  g.drawLine(xs, ys, xe, ye);  }  // randomCode记录随机产生的验证码  StringBuffer randomCode = new StringBuffer();  // 随机产生codeCount个字符的验证码。  for (int i = 0; i < codeCount; i++) {  String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。  red = random.nextInt(255);  green = random.nextInt(255);  blue = random.nextInt(255);  g.setColor(new Color(red, green, blue));  g.drawString(strRand, (i + 1) * x, codeY);  // 将产生的四个随机数组合在一起。  randomCode.append(strRand);  }  // 将四位数字的验证码保存到Session中。  code=randomCode.toString();       }  public void write(String path) throws IOException {  OutputStream sos = new FileOutputStream(path);  this.write(sos);  }  public void write(OutputStream sos) throws IOException {  ImageIO.write(buffImg, "png", sos);  sos.close();  }  public BufferedImage getBuffImg() {  return buffImg;  }  public String getCode() {  return code;  }
}  

ImgFontByte.java

package cn.dsna.util.images;
import java.io.ByteArrayInputStream;
import java.awt.*;
/** * ttf字体文件 * @author dsna * */
public class ImgFontByte {  public Font getFont(int fontHeight){  try {  Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));  return baseFont.deriveFont(Font.PLAIN, fontHeight);  } catch (Exception e) {  return new Font("Arial",Font.PLAIN, fontHeight);  }  }  private  byte[] hex2byte(String str) {   if (str == null)  return null;  str = str.trim();  int len = str.length();  if (len == 0 || len % 2 == 1)  return null;  byte[] b = new byte[len / 2];  try {  for (int i = 0; i < str.length(); i += 2) {  b[i / 2] = (byte) Integer  .decode("0x" + str.substring(i, i + 2)).intValue();  }  return b;  } catch (Exception e) {  return null;  }  } /** * ttf字体文件的十六进制字符串 * @return */  private String getFontByteStr(){ return null;  return str;//字符串太长 在附件中找  }
}  

ValidateCodeServlet.java Servlet调用方法

package cn.dsna.util.images;  import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;  public class ValidateCodeServlet extends HttpServlet {  private static final long serialVersionUID = 1L;  @Override  protected void doGet(HttpServletRequest reqeust,  HttpServletResponse response) throws ServletException, IOException {  // 设置响应的类型格式为图片格式  response.setContentType("image/jpeg");  //禁止图像缓存。  response.setHeader("Pragma", "no-cache");  response.setHeader("Cache-Control", "no-cache");  response.setDateHeader("Expires", 0);  HttpSession session = reqeust.getSession();  ValidateCode vCode = new ValidateCode(120,40,5,100);  session.setAttribute("code", vCode.getCode());  vCode.write(response.getOutputStream());  }
/** * web.xml 添加servlet <servlet> <servlet-name>validateCodeServlet</servlet-name> <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class> </servlet>     <servlet-mapping> <servlet-name>validateCodeServlet</servlet-name> <url-pattern>*.images</url-pattern> </servlet-mapping> 在地址栏输入XXX/dsna.images 测试 */  }  

测试类

ValidateCodeTest.java

package cn.dsna.util.images;  import java.io.IOException;
import java.util.Date;  public class ValidateCodeTest {  /** * @param args */  public static void main(String[] args) {  ValidateCode vCode = new ValidateCode(120,40,5,100);  try {  String path="D:/t/"+new Date().getTime()+".png";  System.out.println(vCode.getCode()+" >"+path);  vCode.write(path);  } catch (IOException e) {  e.printStackTrace();  }  }  }  

web.xml 配置

<servlet>  <servlet-name>validateCodeServlet</servlet-name>  <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class>
</servlet>
<servlet-mapping>  <servlet-name>validateCodeServlet</servlet-name>  <url-pattern>*.images</url-pattern>
</servlet-mapping> 
  • dsnaValidateCode.jar (30.4 KB)
  • dsnaValidateCode_src.rar (27.5 KB)

java图形验证码生成工具类相关推荐

  1. java 图形校验_java图形验证码生成工具类 web页面校验验证码

    java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...

  2. java图片缩放工具类,一个JAVA图形缩放处置工具类

    一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...

  3. Java生产验证码各种工具类

    文章目录 一.生成数字加减验证码 二.糊涂工具类生产验证码 三.Happy-captcha生产验证码 四.easy-captcha生成验证码 五.Kcaptcha生成验证码 一.生成数字加减验证码 1 ...

  4. 短信验证码生成工具类

    public class ImageCodeUtil { /** * 验证码难度级别 Simple-数字 Medium-数字和小写字母 Hard-数字和大小写字母 / public enum Secu ...

  5. JAVA 短链码生成工具类

    请慢用,如果对你有帮助,就留个言,点个赞. ConversionUtils.java 包含: 自增id转换方法 MD5+BASE64转换方法 import lombok.extern.slf4j.Sl ...

  6. 简单版:带干扰线的图形验证码生成

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.生成工具类; import java.awt.Color; import java.awt.Fo ...

  7. 谷歌验证码kaptcha生成工具类

    谷歌验证码生成工具类 1.引入依赖 2.验证码配置类 3.controller层 4.测试 5.目录结构 1.引入依赖 <!-- google kaptcha依赖 --> <depe ...

  8. JAVA接口签名sign生成工具类

    签名规则 1.线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret 2.加入timestamp(时间戳),10分钟内数据有效 3.加入流水号nonce(防止 ...

  9. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

最新文章

  1. 全国计算机表演赛登录,科技支教 妙笔生辉----第十六届全国“六一”儿童节计算机表演赛...
  2. 微信小程序server-1-搭建HTTPS server
  3. the first weekend of ChengDu
  4. 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)
  5. python银行系统模拟演练_python多线程实现代码(模拟银行服务操作流程)
  6. 阿里云NAS备份服务
  7. java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
  8. android技巧:把自己的app变成手机系统自带的app[/system/app]
  9. 奇虎360-数据可视化
  10. ClearCase汇编
  11. NVIDIA驱动安装
  12. 显卡部分性能指标 转载
  13. AR智能隐形眼镜市场前景动态及发展规划建议报告2022-2028年版
  14. [论文阅读] 基于辅助函数的IVA(使用源先验的四阶关系)
  15. linux-alpine安装软件使用指定安装源
  16. 模电之静态工作点的定义与目的//2021-2-14
  17. 人人都会设计模式---建造者模式--Builder
  18. 广州市劳动保障总集成项目1.06亿
  19. BTOS是固定在微型计算机,给音乐来点不一样的味道!试玩飞傲Q1 Mark ⅡBTR1耳放...
  20. ansys用什么cpu_学ansys软件需要什么样的电脑配置才能运行?

热门文章

  1. [PAT乙级]1029 旧键盘
  2. 蓝桥杯2017初赛-分巧克力-二分
  3. 蓝桥杯2015初赛-奇妙的数字
  4. 双端队列 BFS + Chamber of Secrets CodeForces - 173B
  5. 蓝桥杯2014届试题9题 小朋友排队(树状数组+类逆序对)
  6. uml类图例子_转:(中文命名)UML类图新手入门级介绍
  7. Jira更换mysql数据库_JIRA6.0更换数据库到MYSQL
  8. GPU Shader 程序调试方法
  9. F. Ivan and Burgers(前缀线性基模板)
  10. 【NOIP模拟】开車【回退贪心】【multiset】