`

动态生成验证码

 
阅读更多
1、创建图片缓冲区
2、设置其宽高
3、得到这个图片的绘制环境(得到画笔)
4、保存图片


BufferedImage bi = new BufferedImage(80,35,BufferedImage.TYPE_INT_RGB);


Graphics2D g = (Graphics2D) bi.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0,80,35);
g.setColor(Color.RED);
g.drawString("HELLO", 2, 35-2);

try {
     ImageIO.write(bi, "JPEG", new FileOutputStream("xxx.jpg"));
} catch (FileNotFoundException e) {
     e.printStackTrace();
} catch (IOException e) {
     e.printStackTrace();
}



完整验证码:

package com.image;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class VerifyCode {
	private int w = 70;
	private int h = 35;
 	private Random r = new Random();
 	// {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
	private String[] fontNames  = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
	// 可选字符
	private String codes  = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
	// 背景色
	private Color bgColor  = new Color(255, 255, 255);
	// 验证码上的文本
	private String text ;
	
	// 生成随机的颜色
	private Color randomColor () {
		int red = r.nextInt(150);
		int green = r.nextInt(150);
		int blue = r.nextInt(150);
		return new Color(red, green, blue);
	}
	
	// 生成随机的字体
	private Font randomFont () {
		int index = r.nextInt(fontNames.length);
		String fontName = fontNames[index];//生成随机的字体名称
		int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
		int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
		return new Font(fontName, style, size);
	}
	
	// 画干扰线
	private void drawLine (BufferedImage image) {
		int num  = 3;//一共画3条
		Graphics2D g2 = (Graphics2D)image.getGraphics();
		for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
			int x1 = r.nextInt(w);
			int y1 = r.nextInt(h);
			int x2 = r.nextInt(w);
			int y2 = r.nextInt(h); 
			g2.setStroke(new BasicStroke(1.5F)); 
			g2.setColor(Color.BLUE); //干扰线是蓝色
			g2.drawLine(x1, y1, x2, y2);//画线
		}
	}
	
	// 随机生成一个字符
	private char randomChar () {
		int index = r.nextInt(codes.length());
		return codes.charAt(index);
	}
	
	// 创建BufferedImage
	private BufferedImage createImage () {
		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
		Graphics2D g2 = (Graphics2D)image.getGraphics(); 
		g2.setColor(this.bgColor);
		g2.fillRect(0, 0, w, h);
 		return image;
	}
	
	// 调用这个方法得到验证码
	public BufferedImage getImage () {
		BufferedImage image = createImage();//创建图片缓冲区 
		Graphics2D g2 = (Graphics2D)image.getGraphics();//得到绘制环境
		StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
		// 向图片中画4个字符
		for(int i = 0; i < 4; i++)  {//循环四次,每次生成一个字符
			String s = randomChar() + "";//随机生成一个字母 
			sb.append(s); //把字母添加到sb中
			float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
			g2.setFont(randomFont()); //设置随机字体
			g2.setColor(randomColor()); //设置随机颜色
			g2.drawString(s, x, h-5); //画图
		}
		this.text = sb.toString(); //把生成的字符串赋给了this.text
		drawLine(image); //添加干扰线
		return image;		
	}
	
	// 返回验证码图片上的文本
	public String getText () {
		return text;
	}
	
	// 保存图片到指定的输出流
	public static void output (BufferedImage image, OutputStream out) 
				throws IOException {
		ImageIO.write(image, "JPEG", out);
	}

public static void main(String[] args) {
		VerifyCode v = new VerifyCode();
		try {
			output(v.getImage(), new FileOutputStream("xxx.jpg"));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println(v.getText());
	}
}




分享到:
评论

相关推荐

    利用servlet动态生成验证码

    本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机字符组成,用户需要正确输入才能完成特定操作,如注册、登录或...

    Web动态生成验证码

    在Web开发中,动态生成验证码是提高网站安全性的重要手段。JSP(JavaServer Pages)和Servlet是Java Web开发中的核心组件,它们可以协同工作来实现这个功能。 JSP是一种服务器端技术,它允许开发者将HTML代码与Java...

    JAVA动态生成验证码的JAVA实现的代码

    在JAVA编程语言中,我们可以实现动态生成验证码的机制,以提供安全的用户验证体验。下面将详细介绍如何在JAVA中实现验证码的生成。 首先,验证码通常由一组随机字符(包括字母、数字)组成,它们被扭曲、旋转或添加...

    (jsp)动态生成验证码

    在Java Web开发中,JSP(JavaServer Pages)是常用的服务器端脚本语言,可以用来动态生成验证码。本文将详细讲解如何使用JSP来实现这一功能。 首先,我们要理解验证码的基本原理。验证码通常包含一串随机生成的字符...

    jsp动态生成验证码

    本话题主要围绕"jsp动态生成验证码"展开,我们将深入探讨如何在JavaServer Pages (JSP) 中实现这一功能。 首先,验证码的生成通常涉及到两个主要部分:后端生成逻辑和前端展示。在JSP中,这通常通过Servlet和...

    Servlet动态生成验证码

    在本场景中,我们关注的是"Servlet动态生成验证码",这是一个常见的安全措施,用于防止自动化脚本或机器人进行恶意操作,如批量注册、密码重置等...通过这种方式,你可以更好地理解和应用Servlet动态生成验证码的技术。

    动态生成验证码 可刷新

    动态生成验证码,可刷新,可用于项目的登录注册等功能上。 ();"/&gt; 文件为jsp类型,导入项目后在需要添加验证码的地方加入这行代码即可。

    .net 动态 生成 验证码

    .net 动态 生成 验证码 .ashx文件

    ASPNET中动态生成验证码图片的方法研究.pdf

    ASPNET中动态生成验证码图片的方法研究.pdf

    登陆验证+servlet动态生成图片验证码

    在IT行业中,登陆验证是确保用户安全性的重要环节,而动态生成的图片验证码是防止恶意自动登录和机器人攻击的有效工具。本文将深入探讨“登陆验证”与“Servlet动态生成图片验证码”的相关知识点,并提供实践指导。 ...

    Asp.Net 生成验证码

    `RegPicShow.aspx.cs`可能包含了这种实现,它在用户请求时动态生成验证码图片并返回。在处理用户提交表单时,还需要检查输入的验证码是否与服务器端保持一致。 在`RegPicShow.aspx`文件中,可能是用于展示验证码的...

    C++调用lua生成验证码图片

    本项目“C++调用lua生成验证码图片”是一个简单的示例,它利用了这两种语言的优势,使得在C++的环境下,通过Lua脚本动态生成验证码图片。下面将详细解释这个项目的知识点。 首先,我们要理解C++和Lua的交互。Lua是...

    servlet生成验证码

    在IT领域,特别是Web开发中,验证码是一种常见的安全机制,用于区分...总之,使用JSP和Servlet技术生成验证码是一种有效提升Web应用安全性的方法,通过合理设计和实现,可以有效地抵御自动化攻击,保护用户数据安全。

    动态生成GIF验证码

    1. **动态生成验证码**:验证码通常由一系列随机字符组成,这些字符可能是数字、字母或其他符号。在本项目中,验证码是动态生成的,这意味着每次用户请求时都会产生一个新的验证码,增加了破解的难度。 2. **GIF...

    动态生成验证码(c#,asp.net,可以使用)

    不少网站为了防止用户利用...所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

    html5生成验证码.zip

    在HTML部分,验证码通常会包含一个图像标签,该标签的src属性指向一个动态生成验证码图片的服务器端脚本。HTML5引入了一些新的元素和属性,例如`&lt;canvas&gt;`元素,可以用于在客户端生成图像,包括验证码。在这个案例中...

    js生成验证码

    2. **事件处理**:利用`onclick`属性绑定事件处理函数,实现动态生成验证码和验证功能。 3. **字符串操作**:通过字符串连接符`+`将随机选择的字符连接成完整的验证码字符串。 4. **随机数生成**:使用`Math.random...

    java 生成动态gif 验证码

    - **Servlet**:在Servlet中调用工具类的方法,生成验证码并将其保存到服务器的一个临时目录,同时将验证码内容保存在Session中,以供后续验证使用。 - **响应客户端**:Servlet返回生成的GIF图像到客户端,通常...

    动态生成图片验证码

    动态生成验证码的技术不断演进,以应对越来越强大的计算机视觉和深度学习技术。例如,引入时间戳确保每个验证码只能使用一次(一次性验证码),或者使用更复杂的数学问题(如计算简单算术题)代替字符验证码(数学...

Global site tag (gtag.js) - Google Analytics