1. 前言

这个主要是验证码功能, 防止客户端使用代码不断的进行发帖操作 [占用服务器资源, 发布无用的信息]
这个作品主要来自于这位网友, 我不过是将这位网友的代码进行’规范化’了一下, 提取了一个生成验证码的方法
。。后面的绘制到窗口的效果是我做的

方法声明
public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List< Character> checkCodes, int minInterference, int interferenceOff)

其思路如下 : 创建一个宽高为width, height的BufferedImage, 然后配置其背景, 字体, 然后随机生成validateLength个checkCodes中的字符, 然后随机颜色的绘制到Image上面, 然后绘制n[至少minInterference, 偏移interferenceOff]条干扰线

**核心代码 **

/**
 * file name : Test02GetCheckCode.java
 * created at : 4:29:34 PM Nov 8, 2015
 * created by
 */

package com.hx.test08;

public class Test02GetCheckCode {

	/*
	自我补充篇之java随机验证码的生成
	Goal:利用java代码生成随机验证码的图片(今天终于想起写这个了)!
	
	我的验证码的优势:每个字母的颜色不同~,大小写字母数字混合,干扰线无规律,颜色也不同!
	缺点:有点传统
	*/
	
	/*
	Author:Lovingshu's Forever
	Date:2011-11-08 22:34
	Remark:Suddenly,I think up that my hobby is programming~not gaming!
	*/
	// 来自 : 
	public static void main(String[] lovingshu){
		
		//Create a image in RAM
		//get the paint of the image in RAM
		//seed of random
		//fill the background
		//the String of code
		// 验证码的宽高, 验证码的长度
		int width = 200;
		int height = 100;
		int validateCodeLength = 4;
		// 最小的干扰线个数, 干扰线的个数的偏差, 背景颜色, 字体, 备选的验证码数据, 验证码可取的数据的长度
		int minInterference = 5;
		int interferenceOff = 5;
		Color bgColor = Color.WHITE;
		Font font = new Font("微软雅黑", Font.ITALIC, 40);
		List<Character> checkCodes = new ArrayList<>(48);
		initCheckCodes(checkCodes);
		int checkCodeBackUpSize = checkCodes.size();
		
		BufferedImage bufImage = getCheckCode(width, height, bgColor, font, validateCodeLength, checkCodes, minInterference, interferenceOff);
		
		// out put the image [save to the file !]
//		try {
//			/*
//			*if you want it be output at the Client,do as follows:
//			*ImageIO.write(bufImage,"JPEG",response.getOutputStream());
//			*/
//			File dstFile = new File(Tools.getTmpPath(30, Tools.PNG) );//this is the path
//			ImageIO.write(bufImage,"jpeg",dstFile);
//			if(dstFile.exists()){
//				System.out.println("Success!");
//			}else{
//				System.out.println("Failed!");
//			}
//		} catch (IOException e) {
//			e.printStackTrace();
//		}finally{
//			System.out.println("Lovingshu's Forever");
//		}
		
		// paint it !
		new MyFrame(bufImage);
		
	}
	
	// 生成验证码图片
		// checkCodeY 为验证码距离顶上的偏移, checkCodeXOff 表示每两个验证数据之间的x方向上的偏移
		// 新建Image, 配置graphics
		// 获取随机的validateLength个字符[颜色随机], 绘制到Image上
		// 随机绘制干扰线 [至少minInterference, 个数偏差在[0, interferenceOff) ] [颜色随机]
	public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List<Character> checkCodes, int minInterference, int interferenceOff) {
		int checkCodeY = height - (height >> 2);
		int checkCodeXOff = width / (validateCodeLength+2);
		
		BufferedImage bufImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		Graphics g = bufImage.getGraphics();
		g.setColor(bgColor);
		g.fillRect(0, 0, width, height);
		g.setFont(font);
		
		StringBuilder validateCode = new StringBuilder();
		while(validateCode.length() < validateCodeLength){
			g.setColor(randomColor() );
			Character curChar = checkCodes.get(random(checkCodes.size()) );
			g.drawString(curChar.toString(), (validateCode.length() + 1) * checkCodeXOff, checkCodeY);
			validateCode.append(curChar );
		}
		
		//draw the interference line
		int interferenceSize = (ran.nextInt(interferenceOff) + minInterference);
		for(int i = 0; i < interferenceSize; i++){
			g.setColor(randomColor() );
			g.drawLine(random(width), random(height), random(width), random(height));
		}	
		
		return bufImage;
	}
	
	// 初始化checkCodes [0-9 & a-z & A-Z]
	private static void initCheckCodes(List<Character> checkCodes) {
		for(char i='0'; i<'9'; i++) {
			checkCodes.add(i);
		}
		for(char i='a'; i<'z'; i++) {
			checkCodes.add(i);
		}
		for(char i='A'; i<'Z'; i++) {
			checkCodes.add(i);
		}
	}
	// random 对象
	static Random ran = new Random();
	// 获取给定范围内的随机数
	public static int random(int range) {
		return ran.nextInt(range);
	}
	// 获取一个随机的颜色
	public static Color randomColor() {
		return new Color(random(255)+1, random(255)+1, random(255)+1);
	}
	
	// 绘制窗口
	static class MyFrame extends JFrame {
		// 窗口的宽高
		static int FRAMEWIDTH = 300;
		static int FRAMEHEIGHT = 200;
		
		// 初始化
		public MyFrame(BufferedImage bufImage) {
			add(new MyPanel(bufImage));
			this.setVisible(true);
			this.setBounds(100, 100, FRAMEWIDTH, FRAMEHEIGHT);
			this.setTitle("CheckCode");
			this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			this.setResizable(false);
		}
	}
	
	// 绘制面板
	static class MyPanel extends JPanel {
		// 需要绘制的图片
		private BufferedImage bufImage;
		
		// 初始化
		public MyPanel(BufferedImage bufImage) {
			this.bufImage = bufImage;
		}
		
		@Override
		public void paint(Graphics g) {
			g.drawImage(bufImage, 0, 0, this);
		}
	}
	
}

效果

0601 生成验证码_Image

0601 生成验证码_List_02

0601 生成验证码_java_03