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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UART和USART的区别

    UART和USART的区别UART定义  UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。  通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输…

    2022年5月12日
    47
  • 20那天android得知

    20那天android得知

    2022年1月14日
    54
  • 高性能风控数据平台设计

    高性能风控数据平台设计各行各业 各个领域 各个渠道 都需要有一系列的完整的风险控制 以保证事情向好的方向发展 而免受不可预估的经济和财产损失而绰手不及 这时候一套完备的风控系统应运而生 以解决实际在生产业务中的各种难题 作为事物的主体 可以采取各种措施和方法 消灭或减少风险事件发生的各种可能性 或减少风险事件发生时造成的损失 这就是风险控制 与金钱打交道的金融行业 风险控制更加重要 金融的本质就是风控 因此 可以看到

    2026年2月1日
    1
  • iphone4s6.1.3越狱_苹果4S越狱

    iphone4s6.1.3越狱_苹果4S越狱转自:http://hi.baidu.com/%E5%BA%AD%E5%89%8D%E9%97%B2%E6%AD%A5/blog/item/7ca7af387709dae53a87cef2.htmlCYDIA软件类dock2.0.2———————–强大的快捷程序软件装了你就不会卸载DOCK2.0.2上图说话?(这个软件需要激活)XX已经做好汉化附件下载,这里补充下DOCK下载cydia.xsellize.com源的,可以完美激活同步推1.02.5IPA软件—–

    2026年1月30日
    4
  • 图像去噪序列——BM3D图像去噪模型实现

    图像去噪序列——BM3D图像去噪模型实现1.BM3D模型简介BM3D模型是一个两阶段图像去噪方法,主要包含两个步骤:(1)在噪声图像上,利用局部区域搜索相似块,并进行堆叠,在变换域(DCT域、FFT域)利用硬阈值去噪方法对堆叠的图像块进行去噪,获得堆叠相似块的估计值,最后,根据均值权重进行聚合;(2)通过步骤(1)获取初步估计的图像,在初步估计的图像上进行相似块的聚合;然后,利用维纳协同滤波进行图像去噪,从而,获取最后的去…

    2022年6月4日
    30
  • 初识ABP vNext(8):ABP特征管理

    初识ABP vNext(8):ABP特征管理

    2020年11月20日
    233

发表回复

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

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