图形验证码的作用?
图形验证码技术可以有效防止注册用户用特定程序暴力破解方式进行不断的登录尝试,造成因注册过于频繁而引起的服务器瘫痪等一系列问题
简单图形验证码示例:
当然生成该图形验证码的类比较简单,仅限于生成一个随机的四位验证码图片,作为java的初学者,可供参考,所用内容均为java基础中最基本的知识书写
代码展示:
public class VerifyCode {
private int w = 70; //设置图形的宽度
private int h = 35; //设置图形的高度
private Random r = new Random(); //生成一个随机变量
private String[] fontNames = {"宋体","华文楷体","黑体","微软雅黑","楷体_GB2312"}; //将字体类型放入数组
private Color bgColor = new Color(255,255,255); //背景色
private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; //可选字符
private String text; //图片中生成的文本
/**
* 生成随机颜色
* @return 返回一个随机的颜色
*/
private Color randomColor() {
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}
/**
* 生成随机字体
* @return 返回一个随机字体
*/
private Font randomFont() {
int index = r.nextInt(fontNames.length);
String fontName = fontNames[index];
int style = r.nextInt(4); //生成随机的样式,0(无样式),1(粗体),2(斜体),3(粗体+斜体)
int size = r.nextInt(5) + 24; //生成随机字号
return new Font(fontName, style, size);
}
/**
* 画干扰线
* @param image 绘制环境
*/
private void drawLine(BufferedImage image) {
int num = 4; //画三条线
Graphics2D g2 = (Graphics2D) image.getGraphics(); //获得画笔
for(int i=0; i<num; i++) { //生成两个点的坐标
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.BLUE); //干扰线是蓝色
g2.drawLine(x1, y1, x2, y2); //划线
}
}
/**
* 随机生成一个字符
* @return 返回一个随机字符
*/
private char randomChar() {
int index = r.nextInt(codes.length());
return codes.charAt(index);
}
/**
* 创建BufferedImage绘制环境
* @return 返回一个绘制环境
*/
private BufferedImage createImage() {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D) image.getGraphics();
g2.setColor(this.bgColor);
g2.fillRect(0, 0, w, h);
return image;
}
/**
* 获取图形验证码
* @return 返回一个图形验证码
*/
public BufferedImage getImage() {
BufferedImage image = createImage(); //创建图片缓冲区
Graphics2D g2 = (Graphics2D) image.getGraphics(); //获得绘制环境
StringBuilder sb = new StringBuilder(); //用来装载生成的验证码文本
//向图片中画4个字符
for(int i=0; i<4; i++) {
String s = randomChar() + ""; //随机生成一个字母
sb.append(s); //把字母添加到sb中
float x = i * 1.0F * w/4; //设置当前字符的x轴坐标
g2.setFont(randomFont()); //设置随机字体
g2.setColor(randomColor()); //设置随机颜色
g2.drawString(s, x, h-5); //画图
}
this.text = sb.toString(); //把生成的字符串赋值给this.text
drawLine(image); //添加干扰线
return image;
}
/**
* 返回验证码图片上的文本
* @return 返回验证码文本
*/
public String getText() {
return text;
}
/**
* 保存图片到指定输出流
* @param image 绘制环境
* @param out 输出流
* @throws IOException
*/
public static void output(BufferedImage image,OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);
}
}