您的位置:首页 > 其它

生成图形验证码

2015-10-13 16:47 316 查看
做了好几次图形验证的需求了,今天好好总结一下,将自己的代码备份一下,便于自己以后方面开发

在做项目的注册用户的时候,一般我们都会用验证码进行验证,那么我们的验证码怎么来了,有3个方法:

1、单纯的用数字进操作,

2、用已有图片进行绑定的方式;

3、在后台自动生成。

这里将的方式就是第三种。

ImageCode.java

package com.jzt.b2b.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

/**
* @author hushengyou 生成图形验证码
*/
public class ImageCode {

// 图片的宽度
private final static int    IMAGEWIDTH  = 120;
// 图片的高度
private final static int    IMAGEHEIGHT = 30;
// 字体大小
private final static int    FONTSIZE    = 14;
// 字符串长度
private final static int    CODE_LENGTH = 6;
// 随机字符范围
private final static char[] CHAR_RANGE  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

private static Random       random      = new Random();

/**
* 获得图片缓冲流
*/
public String getImageCode(HttpServletResponse response) {
// 设置不缓存图片
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 指定生成的相应图片
response.setContentType("image/jpeg");
// 生成画布 //IMAGEWIDTH * CODE_LENGTH
BufferedImage image = new BufferedImage(IMAGEWIDTH, IMAGEHEIGHT, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文 (生成画笔)
Graphics2D graphics = image.createGraphics();
// 设置背景色()
graphics.setColor(getRandomColor(200, 255));
// 设置字体
graphics.setFont(new Font("Times New Roman", Font.BOLD, FONTSIZE));
// 填充矩形区域 ,绘制背景
graphics.fillRect(0, 0, IMAGEWIDTH, IMAGEHEIGHT);

graphics.setColor(getRandomColor(180, 200));
// 绘制随机干扰线
drawRandomLines(graphics, 160);
// 获取随机字符
String code = getRandomString();
// 绘制随机字符
drawRandomString(graphics, code);
// 图像生效
graphics.dispose();
try {
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(image, "jpeg", sos);
sos.flush();
sos.close();
} catch (Exception e) {
e.printStackTrace();
}
return code;
}

/**
* 生成指定字符串的图像
*
* @param verifyCode 即将被打印的随机字符串
* @return 生成的图像
*/
private static void drawRandomString(Graphics2D graphics, String code) {
Color color = new Color(20 + random.nextInt(20), 20 + random.nextInt(20), 20 + random.nextInt(20));
// 设置边框颜色
graphics.setColor(color);

// // 画出边框
// for (int i = 0; i < 2; i++)
// graphics.drawRect(i, i, IMAGEWIDTH * CODE_LENGTH - i * 2 - 1, IMAGEHEIGHT - i * 2 - 1);

// 画字符串
for (int i = 0; i < CODE_LENGTH; i++) {
String temp = code.substring(i, i + 1);

// 想文字旋转一定的角度
AffineTransform trans = new AffineTransform();
trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);
// 缩放文字
float scaleSize = random.nextFloat() + 0.8f;
if (scaleSize > 1f) scaleSize = 1f;
trans.scale(scaleSize, scaleSize);
graphics.setTransform(trans);

graphics.setColor(getRandomColor(0, 180));
// 设置字体位于的位置(字,x轴,y轴)
graphics.drawString(temp, 15 * i + 18, 14);
}
}

/**
* 生成随机字符串
*
* @return 随机字符串
*/
public static String getRandomString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < CODE_LENGTH; i++) {
sb.append(CHAR_RANGE[random.nextInt(CHAR_RANGE.length)]);
}
return sb.toString();
}

/**
* 生成随机颜色
*
* @param ll 产生颜色值下限(lower limit)
* @param ul 产生颜色值上限(upper limit)
* @return 生成的随机颜色对象RGB
*/
private static Color getRandomColor(int ll, int ul) {
if (ll > 255) ll = 200;
if (ul > 255) ul = 255;
int r = random.nextInt(ul - ll);
int g = random.nextInt(ul - ll);
int b = random.nextInt(ul - ll);
Color color = new Color(r, g, b);
return color;
}

/**
* 绘制干扰线
*
* @param graphics Graphics2D对象,用来绘制图像
* @param nums 干扰线的条数
* @return
*/
public static void drawRandomLines(Graphics2D graphics, int nums) {
// 设置随机干扰线条颜色
graphics.setColor(getRandomColor(160, 200));

// //产生nums 条干扰线条
for (int i = 0; i < nums; i++) {
int x1 = random.nextInt(IMAGEWIDTH);
int y1 = random.nextInt(IMAGEHEIGHT);
int x2 = random.nextInt(12);
int y2 = random.nextInt(12);
graphics.drawLine(x1, y1, x2, y2);
}
}

}


jsp代码:
<img src="/user/imageCode.htm" class="codePic" id="codePic"/>
<a href="javascript:refresh()">换一组</a>

function refresh(){
$("#codePic").attr("src","/user/imageCode.htm?t="+new Date());
}


注意:如果用Spring MVC框架开的话,可以利用

spring
MVC中引入captcha的插件生成图片验证码

具体查看,Spring mvc 自动生成图片验证码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: