java生成验证码

这篇博客介绍了如何使用Java生成验证码图片,包括定义一个`ImageCodeAction`类,调用`ImageUtil`工具类来创建包含4个随机字符的验证码,并将其存入session,同时绘制干扰线。`ImageUtil`类中包含了生成随机颜色、创建干扰线和图片的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class ImageCodeAction extends BaseAction{
	private InputStream imageStream;//输出
	public String execute() {
		//1.调用图片生成工具,生成一个图片及验证码;
        Map中的key是验证码字符串;map中的value是验证码图片;
		Map<String,BufferedImage> map = ImageUtil.createImage();
		//2.将map里的key(即验证码)取出
		String code = null;
		//取出map中的所有key,并放在set集合中;
		Set<String> set = map.keySet();
		//遍历取出所有的key;
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			code = it.next();
		}
		//3.将取出的map中的key全部放入session,当点击登陆时要从session中获取;
		session.put("imageCode", code);
		//4.将map里的图片取出(通过map中的key,value取出);
		BufferedImage image = map.get(code);
		try {
			imageStream = ImageUtil.getInputStream(image);
		} catch (IOException e) {
		   return "error";
		}
		return "success";
	}
	public InputStream getImageStream() {
		return imageStream;
	}
	public void setImageStream(InputStream imageStream) {
		this.imageStream = imageStream;
	}
}
ImageUtil工具类如下:
	public final class ImageUtil {
		private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9'};
		private static final int SIZE = 4;//验证码上是4个字母;
		private static final int LINES = 5;//画5条干扰线;
		private static final int WIDTH = 80;//图片宽度;
		private static final int HEIGHT = 35;//图片高度;
		private static final int FONT_SIZE = 30;
		public static Map<String, BufferedImage> createImage() {
//创建一个StringBuffer字符串对象;
			StringBuffer sb = new StringBuffer();			
//创建一个BufferedImage图片对象;
			BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
					BufferedImage.TYPE_INT_RGB);
	        //在创建的图片上添加一个图形对象;
			Graphics graphic = image.getGraphics();
			//下面这两句是给一个正方形图形填充背景色;
			graphic.setColor(Color.LIGHT_GRAY);
			graphic.fillRect(0, 0, WIDTH, HEIGHT);
			Random ran = new Random();
			// 在正方形图形上画4个随机字符
			for (int i = 1; i <= SIZE; i++) {
				int r = ran.nextInt(chars.length);
				graphic.setColor(getRandomColor());
				graphic.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE));
				graphic.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE,
						HEIGHT-5);
				sb.append(chars[r]);// 将字符保存到StringBuffer中;
			}
			// 画干扰线(干扰线的条数是LINES)
			for (int i = 1; i <= LINES; i++) {
				graphic.setColor(getRandomColor());
				//drawLine方法的四个参数分别是设置干扰线的起点和结束点坐标;
				graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT),
						ran.nextInt(WIDTH), ran.nextInt(HEIGHT));
			}
	Map<String, BufferedImage> map = new HashMap<String, BufferedImage>();
//将画好的4个字符放入map中的key中;同时将image图像放到value中;
			map.put(sb.toString(), image);
			return map;
		}
		public static Color getRandomColor() {
			Random ran = new Random();
			Color color = new Color(ran.nextInt(256), ran.nextInt(256),
					ran.nextInt(256));
			return color;
		}
		public static InputStream getInputStream(BufferedImage image)
				throws IOException {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
			encoder.encode(image);
			byte[] imageBts = bos.toByteArray();
			InputStream in = new ByteArrayInputStream(imageBts);
			return in;
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值