java实现验证码步骤

思考原因:验证码仿佛在网页注册中出现的频率很高,但为什么会要使用验证码,又怎样实现的?这一系列的问题引起了我的好奇。

于是,我查相关资料。

相关资料:

验证码(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();
		
			
	}

}

随机生成的验证码:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值