1. 程式人生 > >驗證碼(隨機數字+字元,數字加減)

驗證碼(隨機數字+字元,數字加減)

<div>
<span style="white-space:pre">	</span><img<span style="white-space:pre">	</span>id="dl_i_code" src="<%=request.getContextPath()%>/user/identifyingCode.yhb">
<span style="white-space:pre">	</span><a href="javascript:refushCode('dl');" title="換一批">換一批</a>
</div>
@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));
	}
}
許多驗證碼都類似,參考一下就行了