`

java生成验证码图片

 
阅读更多
参考了些网上代码,自己写了一个验证


第一:写一个图片生成类

package com.demo.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 生成一个校验图片
 */
public class ImageUtil {
	private static final int WIDTH = 80;
	private static final int HIGHT = 30;
	private static final char[] CODE_SEQUENCE = { '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	// 验证码字符个数
	private static final int CODE_COUNT = 4;
	// 字体的位置参数
	private static final int FONT_AREA = WIDTH / (CODE_COUNT + 1);

	public static void createCheckImg(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		// 定义图像
		BufferedImage bi = new BufferedImage(WIDTH, HIGHT,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D gd = bi.createGraphics();
		// 随机数
		Random random = new Random();
		// 矩形填充为白色
		gd.fillRect(0, 0, WIDTH, HIGHT);
		gd.setColor(Color.white);
		// 根据高宽设置字体
		// 字体四种风格  plain bold italic
		Font font = new Font("Fixedsys", Font.BOLD, HIGHT - 5);
		gd.setFont(font);
		// 画边框
		gd.setColor(Color.BLACK);
		gd.drawRect(0, 0, WIDTH - 1, HIGHT - 1);
		gd.setColor(Color.BLACK);    
		// 随机产生几条干扰线
		for (int i = 0; i < 6; i++) {
			int x1 = random.nextInt(WIDTH);
			int y1 = random.nextInt(HIGHT);
			int x2 = random.nextInt(20);
			int y2 = random.nextInt(10);
			gd.drawLine(x1, y1, x1 + x2, y1 + y2);
		}
		// 产生随机码
		int red = 0, green = 0, blue = 0;
		// 存储数据的buffer
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < CODE_COUNT; i++) {
			// 得到随机数
			String strRand = String.valueOf(CODE_SEQUENCE[random.nextInt(36)]);
			// 产生随机的颜色
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			// 将验证码绘成图案
			gd.setColor(new Color(red, green, blue));
			gd.drawString(strRand, (i ) * FONT_AREA, HIGHT - 4);// x,y表坐标位置,按照宽度分5个坐标
			// 拼接数字
			sb.append(strRand);
		}
		// 设置session
		request.getSession().setAttribute("checkCode", sb.toString());
		// 禁止图像缓存。
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/jpeg");
		ServletOutputStream sos = response.getOutputStream();
		ImageIO.write(bi, "jpg", sos);
		sos.close();
	}
}

第二:
    前端获取验证码
  
 <img src="${ctx}/uploadFile/createImg" id="checkImg" alt="wait..."/>
 <a href="#" onclick="changeImg()">换一张</a> 
 <script type="text/javascript">
 //换验证图片
 	function changeImg(){
	 var img = $("#checkImg");
	 var imgSrc = img.attr("src");
	 img.attr("src",changeUrl(imgSrc));
 }
 
 //无了使图片不一样,不让浏览器加上缓存,所以用时间戳来作为参数
	function changeUrl(imgSrc){
	   var timestamp = (new Date()).valueOf();
	   var indexTemp =imgSrc.indexOf("="); 
	   if(indexTemp>0){
		   var subUrl = imgSrc.substring(0,indexTemp);
		   var resultUrl = subUrl + "=" + timestamp; 
		   return resultUrl;
	   }else{
		   var resultUrl = imgSrc + "?" + "timestamp=" + "timestamp";
		   return resultUrl;
	   }
 }
</script>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics