思考原因:验证码仿佛在网页注册中出现的频率很高,但为什么会要使用验证码,又怎样实现的?这一系列的问题引起了我的好奇。
于是,我查相关资料。
相关资料:
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。
自己的总结:验证码是区分人为操作还是电脑自动操作的小程序。
如何用代码实现实现:
思考核心过程:
1.画出矩形
2.画字符
3.画干扰线
4.将缓冲图片写入文件中
/**
* 项目名称:产生验证码,将其输出到一个png格式的文件中
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
/**
*
* @author Character_Painter
* @since 2.0
*/
public class Comfirm {
private static final int height =50;//验证码区域的高度
private static final int weight =160 ;//验证码区域的宽度
/**
*
* @param min 随机数最小值
* @param max 随机数最大值
* @return 特定范围内的随机数
*/
public static int r(int min,int max){
Random random = new Random();
int num = random.nextInt(max-min)+min;
return num;
}
/**
* 画验证码区域随机颜色矩形
* @param g 画笔
*/
public static void paint(Graphics g){
g.setColor(new Color(r(12,45),r(33,140),r(89,143)));
g.drawRect(0, 0,height,weight);
}
/**
*
* @param str 随机数源字符串
* @param g 画笔
*/
public static void paintchar(String str,Graphics g){
int num =4;
g.setColor(new Color(r(0, 200),r(0,200),r(0,200)));
g.setFont(new Font("Times New Roman", Font.PLAIN, 50));
String a=str.charAt(r(0,str.length()))+"";
String b=str.charAt(r(0,str.length()))+"";
String c=str.charAt(r(0,str.length()))+"";
String d=str.charAt(r(0,str.length()))+"";
String stringBuilder =a+b+c+d;
g.drawString(stringBuilder, 30,30);
}
/**
* 画干扰线
* @param g
*/
public static void paintLine(Graphics g){
g.drawLine(r(0,weight),r(0,height) ,r(0,weight), r(0,height));
}
public static void main(String[] args) throws IOException {
//字节输出流
FileOutputStream outFile = new FileOutputStream("pic.png");
//验证码源字符串
String srcString ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz";
//缓冲图片
BufferedImage bim = new BufferedImage(weight, height,BufferedImage.TYPE_INT_RGB);
Graphics gc = bim.getGraphics();
paint(gc);
paintchar(srcString, gc);
paintLine(gc);
//将缓冲区内的图片,加载到字节输出流中,写入到pic.png中
ImageIO.write(bim,"png",outFile);
outFile.close();
}
}
随机生成的验证码: