java工具类——验证码(VerifyCode)[通俗易懂]

java工具类——验证码(VerifyCode)[通俗易懂]importjava.awt.BasicStroke;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.FileNotFoundException;importjava.io.IOExcept

大家好,又见面了,我是你们的朋友全栈君。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
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();
	// 定义有那些字体
	private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
	// 定义有那些验证码的随机字符
	private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
	// 生成背景色
	private Color bgColor = new Color(250, 250, 250);
	// 用于gettext 方法 获得生成的验证码文本
	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);
		int size = r.nextInt(5) + 24;

		return new Font(fontName, style, size);
	}

	// 画干扰线
	private void drawLine(BufferedImage image) {
		int num = 3;
		Graphics2D g2 = (Graphics2D) image.getGraphics();
		for (int i = 0; i < num; i++) {
			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);
		}
	}

	// 得到codes的长度内的随机数 并使用charAt 取得随机数位置上的codes中的字符
	private char randomChar() {
		int index = r.nextInt(codes.length());
		return codes.charAt(index);
	}

	// 创建一张验证码的图片
	public BufferedImage createImage() {
		BufferedImage image = new BufferedImage(w, h,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = (Graphics2D) image.getGraphics();
		StringBuilder sb = new StringBuilder();
		// 向图中画四个字符
		for (int i = 0; i < 4; i++) {
			String s = randomChar() + "";
			sb.append(s);
			float x = i * 1.0F * w / 4;
			g2.setFont(randomFont());
			g2.setColor(randomColor());
			g2.drawString(s, x, h - 5);

		}
		this.text = sb.toString();
		drawLine(image);

		// 返回图片
		return image;

	}

	// 得到验证码的文本 后面是用来和用户输入的验证码 检测用
	public String getText() {
		return text;
	}

	// 定义输出的对象和输出的方向
	public static void output(BufferedImage bi, OutputStream fos)
			throws FileNotFoundException, IOException {
		ImageIO.write(bi, "JPEG", fos);
	}
}

以上,就生成了一个验证码。

 写一个test,生成指定的验证码图像jpg

public class test {
	public static void main(String[] args) throws IOException {
		VerifyCode code = new VerifyCode();
		BufferedImage image = code.createImage();
		ImageIO.write(image,"jpg",new File("F:/image.jpg"));
	}
}

当然,也可以在servlet里生成。

@WebServlet(urlPatterns="/VerifyCodeServlet.do")
public class VerifyCodeServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		VerifyCode code = new VerifyCode();
		BufferedImage image = code.createImage();
		ImageIO.write(image,"jpg",response.getOutputStream());
	}

}

然后展示在.html或.jsp里

<img src="VerifyCodeServlet.do">

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159571.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JRE配置完整 tomcat闪退问题

    JRE配置完整 tomcat闪退问题如果你的JRE环境配置没有问题的话很有可能是你的Tomcat版本和jdk版本不相容导致的闪退 以我的电脑为例,我安装的是:当我解压安装Tomcat70.73的时候就出现了闪退的问题而当我下载最新的Tomcat9.0.13后就直接可以了至于闪退而不知道具体的问题的时候可以修改start.bat文件中的最后一行:“call"%EXECUTABLE%"start%CMD…

    2022年5月30日
    34
  • crm工作机会实体

    crm工作机会实体

    2022年1月17日
    47
  • rsyslog配置日志服务器_linux开启rsyslog

    rsyslog配置日志服务器_linux开启rsyslogRsyslog是一个开源软件实用程序,用于UNIX和类Unix计算机系统,用于在IP网络中转发日志消息,收集日志。它实现了基本的syslog协议,通过基于内容的过滤,丰富的过滤功能,灵活的配置选项扩展了它,并添加了诸如使用TCP进行传输等功能。一、配置环境系统:Debian二、Rsyslog配置基本上Linux系统都安装Rsyslog服务但没有开启,只需要修改配置文件即可使用。首先,如…

    2022年9月25日
    0
  • temptation系列_dramatical murder攻略

    temptation系列_dramatical murder攻略投影投影是JMESPath的关键特性之一。它允许您将表达式应用于元素集合。有五种投影:列表投影切片投影对象投影展平投影过滤投影处理投影需要注意的点投影分为两个步骤。左侧(LHS)创建一

    2022年7月28日
    2
  • matlab中doc怎么用_ipaddock栏设置

    matlab中doc怎么用_ipaddock栏设置dock栏是是苹果IOS系统或者MAC系统自带任务栏以及切换的快捷窗口,一般活动桌面为最下方固定的界面就是dock栏;MAC系统中的Dock栏,可以显示、切换下运行的程序,也可以单击上面的程序图标则启动那个程序。本文操作环境:iOS12.3.1系统,iPhone11。Dock栏就是苹果IOS系统或者MAC系统自带任务栏以及切换的快捷窗口,一般活动桌面为最下方固定的界面就是dock栏。MAC系统…

    2022年9月12日
    0
  • Linux服务器安全初始化自选安装Shell脚本

    Linux服务器安全初始化自选安装Shell脚本

    2021年8月20日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号