验证码(随机数字+字符,数字加减)

		id="dl_i_code" src="<%=request.getContextPath()%>/user/identifyingCode.yhb">
	换一批



@RequestMapping(value = "user/identifyingCode.yhb")
	@ResponseBody
	public String identifyingCode(HttpServletRequest request,
			HttpServletResponse response) {
		response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片
		response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expire", 0);
		IdentifyingCode randomValidateCode = new IdentifyingCode();
		try {
			randomValidateCode.getRandcode(request, response);// 输出图片方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "NONE";
	}



public class IdentifyingCode {

	public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key
	private Random random = new Random();
	//private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串
	private String randString = "0123456789";// 随机产生数字
	private String randFH="+-x";
	private String randZF="我爱中国游伙伴";

	private int width = 80;// 图片宽
	private int height = 33;// 图片高
	private int lineSize = 40;// 干扰线数量
	private int stringNum = 1;// 随机产生字符数量

	/*
	 * 获得字体
	 */
	private Font getFont() {
		return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
	}

	/*
	 * 获得颜色
	 */
	private Color getRandColor(int fc, int bc) {
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc - 16);//110+7
		int g = fc + random.nextInt(bc - fc - 14);//110+9
		int b = fc + random.nextInt(bc - fc - 18);//110+5
		return new Color(r, g, b);
	}

	/**
	 * 生成随机图片
	 */
	public void getRandcode(HttpServletRequest request,
			HttpServletResponse response) {
		HttpSession session = request.getSession();
		// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_BGR);
		Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
		g.fillRect(0, 0, width, height);
		g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
		g.setColor(getRandColor(110, 133));
		// 绘制干扰线
		for (int i = 0; i <= lineSize; i++) {
			drowLine(g);
		}
		// 绘制随机字符
		String randomString = "";
		for (int i = 1; i <= stringNum; i++) {
			randomString = drowString(g, randomString, i);
		}
		char [] stringArr = randomString.toCharArray();
		if(stringArr[1]=='+'){
			randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))+Integer.parseInt(String.valueOf(stringArr[2]))); 
		}else if(stringArr[1]=='-'){
			randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))-Integer.parseInt(String.valueOf(stringArr[2])));  
		}else if(stringArr[1]=='x'){
			randomString=String.valueOf(Integer.parseInt(String.valueOf(stringArr[0]))*Integer.parseInt(String.valueOf(stringArr[2]))); 
		}
		
		session.removeAttribute(RANDOMCODEKEY);
		session.setAttribute(RANDOMCODEKEY, randomString);
		g.dispose();
		try {
			ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * 绘制字符串
	 */
//	private String drowString(Graphics g, String randomString, int i) {
//		g.setFont(getFont());
//		
//		String rand ="";
//		
//		if(i==5){
//			g.setColor(new Color(230,0,0));
//			rand=getRandomString2(random.nextInt(randZF.length()));
//		}else{
//			g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
//					.nextInt(121)));
//			rand = String.valueOf(getRandomString(random.nextInt(randString
//					.length())));
//		}				
//		randomString += rand;
//		g.translate(random.nextInt(4), random.nextInt(4));
//		g.drawString(rand, 13 * i, 24);
//		return randomString;
//	}
	
	private String drowString(Graphics g, String randomString, int i) {
	g.setFont(getFont());
	
	g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
			.nextInt(121)));
	String rand1 = String.valueOf(getRandomString(random.nextInt(randString
			.length())));
	String rand2 = String.valueOf(getRandomString(random.nextInt(randString
			.length())));
	String rand3 = String.valueOf(getRandomStringFH(random.nextInt(randFH
			.length())));
	randomString += rand1+rand3+rand2+"=";
	g.translate(random.nextInt(2), random.nextInt(2));
	g.drawString(randomString, 13 * i, 24);
	return randomString;
}

	/*
	 * 绘制干扰线
	 */
	private void drowLine(Graphics g) {
		int x = random.nextInt(width);
		int y = random.nextInt(height);
		int xl = random.nextInt(13);
		int yl = random.nextInt(15);
		g.drawLine(x, y, x + xl, y + yl);
	}

	/*
	 * 获取随机的字符
	 */
	public String getRandomString(int num) {
		return String.valueOf(randString.charAt(num));
	}
	
	/*
	 * 获取随机的汉字
	 */
	public String getRandomString2(int num) {
		return String.valueOf(randZF.charAt(num));
	}
	/*
	 * 获取随机的运算符号
	 */
	public String getRandomStringFH(int num) {
		return String.valueOf(randFH.charAt(num));
	}
}
许多验证码都类似,参考一下就行了

你可能感兴趣的:(验证码)