Java登录界面验证码实现

为了保证软件的安全性,通常要求在登录界面中输入验证码,这里我们从文字验证码到图片验证码再到加有干扰线的图片验证码逐步进行实现,实现的具体效果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于其中很多的方法基本上都在之前的实例中出现过,在这里就不赘述了,直接贴代码,有一些之前没用过的已经由注释解释

实现代码

public class ChineseCodePanel extends JPanel {//中文验证码
	public void paint(Graphics g) {
		String hanzi = "Java程序开发之中文验证码的实现";
		String num = "";
		BufferedImage image = new BufferedImage(400,300,BufferedImage.TYPE_INT_RGB);
		Graphics gs = image.getGraphics();
		if(!num.isEmpty()) {
			num = "";
		}
		Font font = new Font("黑体",Font.BOLD,20);
		gs.setFont(font);
		gs.fillRect(0, 0, 400, 300);
		Random random = new Random(); //产生随机数
		for(int i=0;i<4;i++) {
			int index = random.nextInt(hanzi.length());
			String ctmp = hanzi.substring(index, index+1);
			num += ctmp;
			Color color = new Color(20+random.nextInt(120),20+random.nextInt(120),20+random.nextInt(120));
			gs.setColor(color);
			Graphics2D gs2d = (Graphics2D)gs;
			AffineTransform trans = new AffineTransform();
			trans.rotate(random.nextInt(45)*3.14/180,22*i+8,7);
			float scaleSize = random.nextFloat()+0.8f;
			if(scaleSize>1f)
				scaleSize = 1f;
			trans.scale(scaleSize, scaleSize);
			gs2d.setTransform(trans);
			gs.drawString(ctmp, 400/6*i+28, 300/2);
		}
		g.drawImage(image, 0, 0, null);
	}

}

public class ImageCodePanel extends JPanel{  //图片验证码
	public void paint(Graphics g) {
		String num = "";
		BufferedImage image = new BufferedImage(400,300,BufferedImage.TYPE_INT_RGB);
		Graphics gs = image.getGraphics();
		if(!num.isEmpty()) {
			num = "";
		}
		Font font = new Font("黑体",Font.BOLD,20);
		gs.setFont(font);
		gs.fillRect(0, 0, 400, 300);
		Image img = null;
		try {
			img = ImageIO.read(new File("src/0.jpg"));
		}catch(IOException e) {
			e.printStackTrace();
		}
		image.getGraphics().drawImage(img, 0, 0, 400,300,null);
		
		Random random = new Random();
		for(int i=0;i<4;i++) {
			char ctmp = (char)(random.nextInt(26)+65);		//产生65到90的随机整数,即A~Z的ASCII码
			num += ctmp;
			Color color = new Color(20+random.nextInt(120),20+random.nextInt(120),20+random.nextInt(120));
			gs.setColor(color);
			Graphics2D gs2d = (Graphics2D)gs;
			AffineTransform trans = new AffineTransform();
			trans.rotate(random.nextInt(45)*3.14/180,22*i+8,7);
			float scaleSize = random.nextFloat()+0.8f;
			if(scaleSize>1f)
				scaleSize = 1f;
			trans.scale(scaleSize, scaleSize);
			gs2d.setTransform(trans);
			gs.drawString(String.valueOf(ctmp), 400/6*i+28, 300/2);
		}
		g.drawImage(image, 0, 0, null);
	}
}

public class DisturbCodePanel extends JPanel { //带干扰线的图片验证码
	public void paint(Graphics g) {
		String num = "";
		BufferedImage image = new BufferedImage(400,300,BufferedImage.TYPE_INT_RGB);
		Graphics gs = image.getGraphics();
		if(!num.isEmpty()) {
			num = "";
		}
		Font font = new Font("黑体",Font.BOLD,20);
		gs.setFont(font);
		gs.fillRect(0, 0, 400, 300);
		Image img = null;
		try {
			img = ImageIO.read(new File("src/0.jpg"));
		}catch(IOException e) {
			e.printStackTrace();
		}
		image.getGraphics().drawImage(img, 0, 0, 400,300,null);
		
		Random random = new Random();
		int startX1 = random.nextInt(250);   //随机获取第一条干扰线起点的x坐标
		int startY1 = random.nextInt(250);	//随机获取第一条干扰线起点的y坐标
		int startX2 = random.nextInt(250)+35;//随机获取第一条干扰线终点的x坐标,也是第二条干扰线起点的x坐标
		int startY2 = random.nextInt(250)+20;//随机获取第一条干扰线终点的y坐标,也是第二条干扰线起点的y坐标
		int startX3 = random.nextInt(250)+90;//随机获取第二条干扰线终点的x坐标
		int startY3 = random.nextInt(300)+5;//随机获取第二条干扰线终点的y坐标
		gs.setColor(Color.WHITE);
		gs.drawLine(startX1, startY1, startX2, startY2);
		gs.setColor(Color.LIGHT_GRAY);
		gs.drawLine(startX2, startY2, startX3, startY3);
		for(int i=0;i<4;i++) {
			char ctmp = (char)(random.nextInt(26)+65);
			num += ctmp;
			Color color = new Color(20+random.nextInt(120),20+random.nextInt(120),20+random.nextInt(120));
			gs.setColor(color);
			Graphics2D gs2d = (Graphics2D)gs;
			AffineTransform trans = new AffineTransform();
			trans.rotate(random.nextInt(45)*3.14/180,22*i+8,7);
			float scaleSize = random.nextFloat()+0.8f;
			if(scaleSize>1f)
				scaleSize = 1f;
			trans.scale(scaleSize, scaleSize);
			gs2d.setTransform(trans);
			gs.drawString(String.valueOf(ctmp), 400/6*i+28, 300/2);
		}
		g.drawImage(image, 0, 0, null);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值