随机生成验证码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

package login.validate;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.imageio.stream.ImageOutputStream;

public class RandomNum {

private ByteArrayInputStream image;//图像

private String str;//验证码

/* public static final char[] code = {'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n',

'o','p','q','r','s','t',

'u','v','w','x','y','z',

'A','B','C','D','E','F','G',

'H','I','J','K','L','M','N',

'O','P','Q','R','S','T',

'U','V','W','X','Y','Z',

'0','1','2','3','4',

'5','6','7','8','9'}; */

private RandomNum(){

init();//初始化属性

}

/*

* 取得RandomNumUtil实例

*/

public static RandomNum Instance(){

return new RandomNum();

}

/*

* 取得验证码图片

*/

public ByteArrayInputStream getImage(){

return this.image;

}

/*

* 取得图片的验证码

*/

public String getString(){

return this.str;

}

private void init() {

// 在内存中创建图象

int width=65, height=20;

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));

// 随机产生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位数字)

String sRand="";

for (int i=0;i<4;i++){

String rand=String.valueOf(random.nextInt(10));

sRand+=rand;

// 将认证码显示到图象中

g.setColor(new

Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

g.drawString(rand,13*i+6,16);

}

//赋值验证码

this.str=sRand;

//图象生效

g.dispose();

ByteArrayInputStream input=null;

ByteArrayOutputStream output = new ByteArrayOutputStream();

try{

ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);

ImageIO.write(image, "JPEG", imageOut);

imageOut.close();

input = new ByteArrayInputStream(output.toByteArray());

}catch(Exception e){

System.out.println("验证码图片出现错误:"+e.toString());

}

this.image=input;/* 赋值图像*/

}

/*

* 给定范围获得随机颜色

*/

private Color getRandColor(int fc,int bc){

Random random = new Random();

if(fc>255) 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);

}

}

相关文档
最新文档