Java Web中生成中文验证码,首先随机拿到几个汉字,然后将获取到的汉字利用Graphics画在图片上面(也不知道我的这个说法对否,我是这么理解的)。具体的实现代码如下,仅作为参考!

package com.bkybk.tools;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CheckcodeServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**
     * 
     * 旋转和缩放文字
     * 
     * 必须要使用Graphics2d类
     */

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//生成一个消息头(content-type),告诉客户端(浏览器),返回的数据类型。
	response.setContentType("text/html;charset=gbk");
	Random r = new Random();
	String strSession = "";
	// 第一步:生成一张图片
	int width = 88;
	int height = 22;
	// 创建一个内存映像对象
	BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	// 获得画笔
	Graphics g = image.getGraphics();
	// 给笔上颜色(随机的一个颜色),设置背景颜色
	g.setColor(new Color(255,255,255));
	//设置画布的大小
	g.fillRect(0, 0, width, height);
	//设置显示字体的样式大小
	g.setFont(new Font("宋体", Font.PLAIN, 17));
	//设置绘画位置
	int startSize = 5;		
	List<String> list = create();
	//获得随机文字
	for (int i = 0; i < 4; i++) {
		//	开始绘图
		g.setColor(new Color(r.nextInt(200), r.nextInt(200), r.nextInt(200)));
		g.drawString(list.get(i), startSize, 18);
		startSize += 20;
		strSession += list.get(i);
	}
	HttpSession session = request.getSession();
	// 将随机文字绑订到session对象上
	session.setAttribute("checkCode", strSession);
	// 第二步,将图片压缩,并输出到时客户端

	// 设置正确的消息头,告诉浏览器返回的是图片
	response.setContentType("image/jpeg");
	// 获得一个字节输出流
	OutputStream ops = response.getOutputStream();
	// 压缩并输出
	javax.imageio.ImageIO.write(image, "jpeg", ops);
    }

    /**
     * 
     * 原理是从汉字区位码找到汉字。在汉字区位码中分
	高位与底位, 且其中简体又有繁体。位数越前生
	成的汉字繁体的机率越大。
     * 
     * 所以在本例中高位从171取,底位从161取, 去掉大部
	分的繁体和生僻字。但仍然会有!!
     * 
     * 
     */
    public static List<String> create() {
	List<String> strList = new ArrayList<String>();
	for (int i = 0; i < 4; i++) {
		try {
			// 定义高低位
			int hightPos, lowPos; 
			Random random = new Random();
			// 获取高位值
			hightPos = (176 + Math.abs(random.nextInt(39)));
			// 获取低位值
			lowPos = (161 + Math.abs(random.nextInt(93)));
			byte[] b = new byte[2];
			b[0] = (new Integer(hightPos).byteValue());
			b[1] = (new Integer(lowPos).byteValue());
			String str = new String(b, "GBK");
			strList.add(str);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
	return strList;
    }

}

标签: Java生成中文验证码图片, 中文验证码, Java生成验证码

添加新评论