java图形验证码生成工具类
转载自 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图形验证码生成工具类相关推荐
- java 图形校验_java图形验证码生成工具类 web页面校验验证码
java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...
- java图片缩放工具类,一个JAVA图形缩放处置工具类
一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...
- Java生产验证码各种工具类
文章目录 一.生成数字加减验证码 二.糊涂工具类生产验证码 三.Happy-captcha生产验证码 四.easy-captcha生成验证码 五.Kcaptcha生成验证码 一.生成数字加减验证码 1 ...
- 短信验证码生成工具类
public class ImageCodeUtil { /** * 验证码难度级别 Simple-数字 Medium-数字和小写字母 Hard-数字和大小写字母 / public enum Secu ...
- JAVA 短链码生成工具类
请慢用,如果对你有帮助,就留个言,点个赞. ConversionUtils.java 包含: 自增id转换方法 MD5+BASE64转换方法 import lombok.extern.slf4j.Sl ...
- 简单版:带干扰线的图形验证码生成
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.生成工具类; import java.awt.Color; import java.awt.Fo ...
- 谷歌验证码kaptcha生成工具类
谷歌验证码生成工具类 1.引入依赖 2.验证码配置类 3.controller层 4.测试 5.目录结构 1.引入依赖 <!-- google kaptcha依赖 --> <depe ...
- JAVA接口签名sign生成工具类
签名规则 1.线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret 2.加入timestamp(时间戳),10分钟内数据有效 3.加入流水号nonce(防止 ...
- Java:二维码生成工具类
java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...
最新文章
- 全国计算机表演赛登录,科技支教 妙笔生辉----第十六届全国“六一”儿童节计算机表演赛...
- 微信小程序server-1-搭建HTTPS server
- the first weekend of ChengDu
- 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)
- python银行系统模拟演练_python多线程实现代码(模拟银行服务操作流程)
- 阿里云NAS备份服务
- java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
- android技巧:把自己的app变成手机系统自带的app[/system/app]
- 奇虎360-数据可视化
- ClearCase汇编
- NVIDIA驱动安装
- 显卡部分性能指标 转载
- AR智能隐形眼镜市场前景动态及发展规划建议报告2022-2028年版
- [论文阅读] 基于辅助函数的IVA(使用源先验的四阶关系)
- linux-alpine安装软件使用指定安装源
- 模电之静态工作点的定义与目的//2021-2-14
- 人人都会设计模式---建造者模式--Builder
- 广州市劳动保障总集成项目1.06亿
- BTOS是固定在微型计算机,给音乐来点不一样的味道!试玩飞傲Q1 Mark ⅡBTR1耳放...
- ansys用什么cpu_学ansys软件需要什么样的电脑配置才能运行?
热门文章
- [PAT乙级]1029 旧键盘
- 蓝桥杯2017初赛-分巧克力-二分
- 蓝桥杯2015初赛-奇妙的数字
- 双端队列 BFS + Chamber of Secrets CodeForces - 173B
- 蓝桥杯2014届试题9题 小朋友排队(树状数组+类逆序对)
- uml类图例子_转:(中文命名)UML类图新手入门级介绍
- Jira更换mysql数据库_JIRA6.0更换数据库到MYSQL
- GPU Shader 程序调试方法
- F. Ivan and Burgers(前缀线性基模板)
- 【NOIP模拟】开車【回退贪心】【multiset】