自定义验证码

 自定义验证码类

public class ImageCodeValidator {

	//验证码保存在session中的属性key
	public static final String SESSION_CODE_KEY = "IMAGE_VALIDATE_CODE";

	// 图片的宽度。
	private int width = 160;
	// 图片的高度。
	private int height = 40;
	// 验证码字符个数
	private int codeCount = 4;
	// 验证码干扰线数
	private int lineCount = 150;

	private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
			'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7','8', '9','a','c','d','e','k','n','r','s','t','v','w','u','v','f','h' };

	public BufferedImage createSessionCode(HttpSession session) {
		int x = 0, fontHeight = 0, codeY = 0;
		int red = 0, green = 0, blue = 0;

		x = width / (codeCount + 2);// 每个字符的宽度
		fontHeight = height - 4;// 字体的高度
		codeY = height - 7;
		// 图像buffer
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bi.createGraphics();
		// 生成随机数
		Random random = new SecureRandom();
		// 将图像填充为白色
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, width, height);
		// 创建字体
		ImgFontByte imgFont = new ImgFontByte();
		Font font = imgFont.getFont(fontHeight);
		g.setFont(font);

		for (int i = 0; i < lineCount/2; i++) {
			int xs = random.nextInt(width);
			int ys = random.nextInt(height);
			int xe = xs + random.nextInt(width / 8);
			int ye = ys + random.nextInt(height / 8);
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			g.setColor(new Color(red, green, blue));
			g.drawLine(xs, ys, xe, ye);
		}
		Random rand = new SecureRandom();
		// randomCode记录随机产生的验证码
		StringBuffer randomCode = new StringBuffer();
		// 随机产生codeCount个字符的验证码。
		for (int i = 0; i < codeCount; i++) {
			String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
			// 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
			red = random.nextInt(225);
			green = random.nextInt(225);
			blue = random.nextInt(225);
			g.setColor(new Color(red, green, blue));

			AffineTransform affine = new AffineTransform();
			int dx = (i+1) * x;
			int dy = codeY;
			affine.rotate(Math.PI / 10 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1),dx+(x/2) ,dy/2);
			g.setTransform(affine);

			g.drawString(strRand, dx, dy);
			// 将产生的四个随机数组合在一起。
			randomCode.append(strRand);
		}

		for (int i = 0; i < lineCount/2; i++) {
			int xs = random.nextInt(width);
			int ys = random.nextInt(height);
			int xe = xs + random.nextInt(width / 8);
			int ye = ys + random.nextInt(height / 8);
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			g.setColor(new Color(red, green, blue));
			g.drawLine(xs, ys, xe, ye);
		}

		// 将四位数字的验证码保存到Session中。
		String code = randomCode.toString();
		session.setAttribute(SESSION_CODE_KEY, code);
		return bi;
	}

	public boolean verifySession(HttpSession session,String code){
		if(null==session || null==code || "".equals(code)){
			return false;
		}
		String codeInSession = (String) session.getAttribute(SESSION_CODE_KEY);
		//boolean b = code.equalsIgnoreCase(codeInSession); 不区分大小写
		boolean b = code.contains(codeInSession); // 区分大小写
		if(b){
			session.removeAttribute(SESSION_CODE_KEY);
		}
		return b;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public int getCodeCount() {
		return codeCount;
	}

	public void setCodeCount(int codeCount) {
		this.codeCount = codeCount;
	}

	public int getLineCount() {
		return lineCount;
	}

	public void setLineCount(int lineCount) {
		this.lineCount = lineCount;
	}

}

字体设置

public class ImgFontByte {

	public Font getFont(int fontHeight) {
		try {
			URL resource = ImgFontByte.class.getClassLoader().getResource("fonts");
			File path = new File(resource.getFile());
			File[] listFiles = path.listFiles();
			if(listFiles.length>0){
				int i = (int) (new SecureRandom().nextDouble() * listFiles.length);
				Font font = Font.createFont(Font.TRUETYPE_FONT, listFiles[i]);
				return font.deriveFont(Font.PLAIN, fontHeight);
			}
		} catch (Exception e) {
		}
		return new Font("Arial", Font.PLAIN, fontHeight);
	}

}

控制层

public class ImageCodeController extends Controller{

	@Autowired
	private ImageCodeValidator imageCodeValidator;
	
	@RequestMapping("/getImage")
	public void getImage(HttpServletRequest request, HttpServletResponse response){
		BufferedImage code = imageCodeValidator.createSessionCode(request.getSession());
		try {
			ServletOutputStream outputStream = response.getOutputStream();
			ImageIO.write(code, "png", outputStream);
			outputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
			logger.error("生成验证码发生异常");
		}
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值