生成验证码效果

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

validatecodeservlet

cn.dsna.util.images.validatecodeservlet

validatecodeservlet

*.images

在地址栏输入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 配置

validatecodeservlet

cn.dsna.util.images.validatecodeservlet

validatecodeservlet

*.images

以上所述是小编给大家介绍的java生成图形验证码工具类,希望对大家有所帮助

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

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

  1. php图形 验证码代码,PHP制作图形验证码代码分享,php图形验证码代码_PHP教程

    PHP制作图形验证码代码分享,php图形验证码代码 效果: myvcode.class.php:封装创建验证码的类 /* * file:myvcode.class.php * 验证码类,类名Vcode ...

  2. java 一维码架包_Java 生成、识别条形码

    条形码是由一定的字符,数字及符号组成,用以表达一组信息的图形标识符.它可以标出物品的商品名称.生产日期.图书分类号,邮件起止地点等.因而在商品流通.图书管理.邮政管理等许多领域得以广泛的应用.本文将通 ...

  3. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

  4. java的概率的程序_java实现一个抽奖概率类

    在一些项目需求中,可能会遇到抽奖问题,如提供一系列奖品及获奖概率,要求根据概率返回每次抽到的奖品.以下是本人在实际项目中写的一个抽奖工具类,与大家共同分享: import java.util.Arra ...

  5. java thread类_java多线程之Thread类

    Class Thread java.lang.Object java.lang.Thread 实现接口:Runnable 直接被继承的子类:ForkJoinWorkerThread public cl ...

  6. android 生成二维码_Java 生成二维码实战

    简介 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码.其提供了多种平台下的客户端包括:J2ME. ...

  7. java输出set集合元素_java Set集合,HashSet类详细介绍

    下面要给大家介绍的就是java Set集合方面的内容,本文主要讲到了HashSet类的一些知识,主要包括了HashSet类的特点,HashSet 类的常用构造方法重载形式以及代码演示了创建两种不同形式 ...

  8. java.lang中所有的类_java.lang中的数学类

    Math 类 Java 中,讲 Math 类定义为 final 类,不能再派生子类. Math 类中定义的常量和方法都用 static 修饰符来修饰,因此不必创建 Math 类的实例,可以通过类名直接 ...

  9. java 不能继承的类_java中不能继承的类有哪些?

    在Java中,只要是被定义为final的类,也可以说是被final修饰的类,就是不能被继承的. 因为jdk的开发者认为,有一些最基本的类没要必要对开发者开放,如果用户继承时操作有误,很可能引入很多问题 ...

最新文章

  1. 汇编语言--寄存器(cpu工作原理)
  2. 我的Android进阶之旅------Android Studio 快捷键整理分享
  3. 常考数据结构与算法:每k个节点反转链表
  4. 【Python基础】Python正则表达式,从入门到实战,精华都在这里!
  5. python中缩进在程序中_python代码缩进
  6. 游戏巨头齐聚 Unite Shanghai 2019,揭秘爆款游戏制作精彩亮点!
  7. 绘制完成的cad图纸文件应使用哪一款看图软件进行查看?
  8. 【2020团体程序设计天梯赛】L1部分(PTA,L1-065到L1-072)题解代码
  9. 多次导入excel实现及excel导入逻辑插件清空数据
  10. (转)知乎-区块链技术:如何赋能供应链创新
  11. 专利CPC客户端保存文件出现Schema校验失败的解决方法
  12. html不存在模板,模板文件不存在,无法解析文档的解决方法
  13. mysql优化方面的面试题
  14. DX9b 与 DX9c 在x文件解析方面带来的麻烦
  15. 分布式事务 - 理论模型
  16. MySQL基础 - 带搜索条件的查询
  17. 初步分析CCLE和GDSC的数据——RNA表达矩阵
  18. 数栈产品分享:干货解读数据中台产品「模块化」设计思路
  19. grab显示连不上服务器,grab 暂时链接不到服务器
  20. GisToSWMM5简介

热门文章

  1. 针对表单的事件;条件语句;定时器的简单介绍;
  2. 3720: Gty的妹子树
  3. 【Shall脚本】定时在线备份上传
  4. Lync 2010迁移Lync 2013 PART8:部署新边缘
  5. DELETE误操作_oracle
  6. spark将rdd转为string_大数据技术之SparkCore(三)RDD依赖关系
  7. SAP中破解系统管理员密码
  8. SAP本地化-银企直连
  9. 内表使用Binary Search的限制
  10. 盘式制动系统卡钳分类