java 验证码的生成算法_java生成验证码图片的方法

本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下

示例一:

import org.apache.commons.codec.binary.Base64;

import org.apache.commons.lang.RandomStringUtils;

import org.apache.commons.lang.StringUtils;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.util.Random;

public class RandomVerifyCode {

private static final String RANDOM_NUM = "23456789";

private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";

private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";

private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;

private int width = 95;// 图片宽

private int height = 25;// 图片高

private int lineSize = 40;// 干扰线数量

private int stringNum = 4;// 随机产生字符数量

private Random random = new Random();

/**

* 获得字体

*/

private Font getFont() {

return new Font("Fixedsys", Font.CENTER_BASELINE, 18);

}

/**

* 获得颜色

*/

private Color getRandColor(int fc, int bc) {

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

int r = fc + random.nextInt(bc - fc - 16);

int g = fc + random.nextInt(bc - fc - 14);

int b = fc + random.nextInt(bc - fc - 18);

return new Color(r, g, b);

}

/**

* 生成随机图片(BASE64格式)

*/

public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {

// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作

g.fillRect(0, 0, width, height);//图片大小

g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小

g.setColor(getRandColor(110, 133));//字体颜色

// 绘制干扰线

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

drowLine(g);

}

// 绘制随机字符

String randomString = "";

for (int i = 1; i <= stringNum; i++) {

randomString = drowString(g, randomString, i);

}

g.dispose();

ByteArrayOutputStream out = new ByteArrayOutputStream();

String encode = null;

try {

// 将内存中的图片通过流动形式输出到客户端

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

encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());

out.close();

} catch (Exception e) {

LogHelper.error("登陆控制","验证码生成","将内存中生成的验证码图片输出为BASE64格式编码失败!");

}

imgBuffer.append(encode);

return randomString;

}

/**

* 绘制字符串

*/

private String drowString(Graphics g, String randomString, int i) {

g.setFont(getFont());

g.setColor(new Color(random.nextInt(101), random.nextInt(111), random

.nextInt(121)));

String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));

randomString += rand;

g.translate(random.nextInt(3), random.nextInt(3));

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

return randomString;

}

/**

* 绘制干扰线

*/

private void drowLine(Graphics g) {

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(13);

int yl = random.nextInt(15);

g.drawLine(x, y, x + xl, y + yl);

}

/**

* 获取随机的字符

*/

public String getRandomString(int num) {

return String.valueOf(RANDOM_STRING.charAt(num));

}

public static String randomString(int length){

return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());

}

}

示例二:

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.awt.image.RenderedImage;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

public class CodeUtil {

private static int width = 90;// 定义图片的width 90

private static int height = 20;// 定义图片的height 20

private static int codeCount = 4;// 定义图片上显示验证码的个数

private static int xx = 15;

private static int fontHeight = 18;

private static int codeY = 16;

private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',

'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};

public static Map codePicMap = new HashMap<>();

/**

* 生成一个map集合

* code为生成的验证码

* codePic为生成的验证码BufferedImage对象

*

* @return

*/

public static Map generateCodeAndPic() {

// 定义图像buffer

BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// Graphics2D gd = buffImg.createGraphics();

// Graphics2D gd = (Graphics2D) buffImg.getGraphics();

Graphics gd = buffImg.getGraphics();

// 创建一个随机数生成器类

Random random = new Random();

// 将图像填充为蓝色

// gd.setColor(Color.WHITE);

gd.setColor(new Color(232,240,254));

gd.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定。

Font font = new Font("Fixedsys", Font.BOLD, fontHeight);

// 设置字体。

gd.setFont(font);

// 画边框。

gd.setColor(Color.BLACK);

gd.drawRect(0, 0, width - 1, height - 1);

// 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。

gd.setColor(Color.BLACK);

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

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

gd.drawLine(x, y, x + xl, y + yl);

}

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

StringBuffer randomCode = new StringBuffer();

int red = 0, green = 0, blue = 0;

// 随机产生codeCount数字的验证码。

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

// 得到随机产生的验证码数字。

String code = String.valueOf(codeSequence[random.nextInt(31)]);

// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

red = random.nextInt(255);

green = random.nextInt(255);

blue = random.nextInt(255);

// 用随机产生的颜色将验证码绘制到图像中。

gd.setColor(new Color(red, green, blue));

gd.drawString(code, (i + 1) * xx, codeY);

// 将产生的四个随机数组合在一起。

randomCode.append(code);

}

Map map = new HashMap<>();

//存放验证码

map.put("code", randomCode);

//存放生成的验证码BufferedImage对象

map.put("codePic", buffImg);

return map;

}

public static void main(String[] args) throws Exception {

//创建文件输出流对象

OutputStream out = new FileOutputStream("D://img/" + System.currentTimeMillis() + ".jpg");

Map map = CodeUtil.generateCodeAndPic();

ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);

System.out.println("验证码的值为:" + map.get("code"));

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持WEB开发者。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值