JSP生成验证码

    这是在网上找到了一片相似的文章,修改后用在自己的工程之中。本来还有一个生成中文验证码的版本,由于保存不当,现在找不到了。思路是:将Character[] codes中的内容改成汉字,当然得用UTF-8的编码。大家可以去网上查汉字对应的UTF-8编码,不过我是用Eclipse的Properties File编辑器,添加汉字,然后查看源码就可以。   比如“张壮壮”就是\u5F20\u58EE \u58EE
<%@ page import="java.util.Random"%>
<%@ page import="java.io.OutputStream"%>
<%@ page import="java.awt.Color"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Graphics"%>
<%@ page import="java.awt.image.BufferedImage"%>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page contentType="image/JPEG"%>
<%	
	Character[] codes = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
			'9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
			'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
			'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
			'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
			'v', 'w', 'x', 'y', 'z' };
	//定义随机数的个数
	int codeNum = 5;
	int width = 120;
	int height = 30;
	int fontHeight = height - 2;
	int codeX = width / (codeNum + 1);
	int codeY = height - 2;
	//设置字体
	//Font font = new Font("Times New Roman", Font.PLAIN, fontHeight); 
	//create the image
	BufferedImage image = new BufferedImage(width, height,
			BufferedImage.TYPE_INT_RGB);
	Graphics g = image.getGraphics();
	// set the background color
	g.setColor(Color.white);
	g.fillRect(0, 0, width, height);
	// draw the border
	g.setColor(Color.black);
	g.drawRect(0, 0, width - 1, height - 1);
	// create a random instance to generate the codes
	Random random = new Random();
	// 随机生产50条图片干扰线条,使验证码图片中的字符不被轻易识别
	g.setColor(Color.black);
	for (int i = 0; i < 50; i++) {
		int x = random.nextInt(width);
		int y = random.nextInt(height);
		int xl = random.nextInt(12);
		int yl = random.nextInt(12);
		g.drawLine(x, y, x + xl, y + yl);
	}
	//定义颜色三素
	int red = 0;
	int green = 0;
	int blue = 0;
	StringBuffer randomCode = new StringBuffer();
	//随机生产codeNum个数字验证码
	for (int i = 0; i < codeNum; i++) {
		//得到随机产生的验证码
		String strRand = String.valueOf(codes[random.nextInt(62)]);
		//使用随机函数产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
		red = random.nextInt(255);
		green = random.nextInt(255);
		blue = random.nextInt(255);
		g.setFont(new Font("Times New Roman", Font.PLAIN, 25));
		//用随机产生的颜色将验证码绘制到图像中。
		g.setColor(new Color(red, green, blue));
		g.drawString(strRand, (i + 1) * codeX, codeY);

		//将产生的四个随机数组合在一起。
		randomCode.append(strRand);
	}
	session.setAttribute("validate", randomCode.toString());
	g.dispose();
	response.setContentType("image/jpeg");
	out.clear();
	out = pageContext.pushBody();
	OutputStream strm = response.getOutputStream();
	ImageIO.write(image, "jpeg", strm);
	strm.close();
%>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值