做web开发,很多时间需要大量生成难证码,写一个验证码是一件很容易的事,但是写得好不会是一件易事。
以下是我写的一个验证码生成方法,经改进行,性能比初时(我第一次写时)被时提升了40%以上,仅供参考。
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 该方法主要是生成验证码,并返4位回验证码
*
* @author Jacky *
*/
public final class ImageCode {
/**
* 经常用到的作静态常量处理,这样会加快处理速度,减少变量第次都要生成的内存空间浪费,用final使程序不用录找该类是否被继承,减少加载时间
*
*/
private static final Random random = new Random();
// 预定义定义四种字体,并将随机得到
private static final Font[] CODEFONT = { new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25), new Font("宋体", Font.BOLD, 25),
new Font("宋体", Font.BOLD, 25) };
// 预定义定义字体颜色,并将随机得到色
private static final Color[] FONTCOLOR = { Color.ORANGE, Color.RED, Color.PINK, Color.BLUE, Color.GREEN };
// 预定义 图片的背景颜色,并将随机得到
private static final Color[] BGCOLOR = { Color.BLACK, Color.WHITE };
// 预定义干扰线的颜色
private static final Color LINECOLOR = new Color(242, 234, 22);
// 预定义生随机的字符,用数组取值比String类型取一个值快
private static final String[] CODE = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
// 返回的验证码
private static StringBuffer CONDENUMBER = null;
// 预定义图片大小
private static final int WIDTH = 100, HEIGHT = 25;
/**
* 生成验证码输出,并输出
*
* @param request
* @param response
* @return codeNumber
*/
public final String image(HttpServletRequest request, HttpServletResponse response) {
CONDENUMBER = new StringBuffer();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(BGCOLOR[random.nextInt(2)]);
g.fillRect(0, 0, WIDTH, HEIGHT);
for (int i = 0; i < 4; i++) {
drawCode(g, i);
}
drawNoise(g, 8);
g.setColor(Color.gray);
g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
g.dispose();
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png");
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
ImageIO.write(image, "png", sos);
sos.flush();
sos.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return CONDENUMBER.toString();
}
/**
* 画验证码
*
* @param request
* @param response
* @return void
*/
private final void drawCode(Graphics graphics, int i) {
String number = CODE[random.nextInt(36)];
graphics.setFont(CODEFONT[random.nextInt(4)]);
graphics.setColor(FONTCOLOR[random.nextInt(5)]);
graphics.drawString(number, 10 + i * 20, 20);
CONDENUMBER.append(number);
}
/**
* 画干扰线
*
* @param graphics
* @param void
*/
private final void drawNoise(Graphics graphics, int lineNumber) {
graphics.setColor(LINECOLOR);
int pointX1, pointY1, pointX2, pointY2;
for (int i = 0; i < lineNumber; i++) {
pointX1 = 1 + (int) (Math.random() * WIDTH);
pointY1 = 1 + (int) (Math.random() * HEIGHT);
pointX2 = 1 + (int) (Math.random() * WIDTH);
pointY2 = 1 + (int) (Math.random() * HEIGHT);
graphics.drawLine(pointX1, pointY1, pointX2, pointY2);
}
}
}
一个调用的例子:
public void image(HttpServletRequest request, HttpServletResponse response) {
ImageCode ic = new ImageCode();
String imageCode = ic.image(request, response);
request.getSession().removeAttribute("imageCode");
//转为小写,从页面输入也转为小写,以达到不分大小写作用
request.getSession().setAttribute("imageCode", imageCode.toLowerCase());
}
不知觉位对上面的写法有什么建议,谢谢。
分享到:
相关推荐
验证码生成工具类是一种在Web应用中广泛使用的安全机制,它主要用于防止自动化的恶意操作,比如机器人注册、垃圾邮件发送等。这个工具类是用Java语言编写的,因此我们可以深入探讨一下Java验证码生成的相关技术和...
验证码生成类大全是一种用于网络安全验证的重要工具,它主要用于防止恶意自动化程序(如机器人)进行非法操作,例如批量注册、刷票或数据抓取。在Web应用中,验证码通常需要用户在提交表单前输入图像上显示的一串...
VC++验证码生成Base64验证码png图片程序,如何使用VC++生成验证码图片,输出Base64图片给网页调用
这个"图片验证码生成demo"是一个示例项目,用于演示如何创建这样的验证码系统。在本文中,我们将深入探讨验证码的工作原理,以及如何使用编程技术来实现一个图片验证码生成器。 验证码的主要目标是防止自动化程序...
验证码生成类是IT领域中一个重要的安全机制,主要用于防止恶意自动化程序或机器人对网站或应用程序进行非法操作。在本文中,我们将深入探讨验证码生成类的相关知识点,并基于提供的文件信息进行详细解析。 首先,...
本项目“页面验证码生成器”提供了一种自定义化的解决方案,允许开发者根据需求调整验证码的字符集、长度、图像尺寸以及干扰纹样式。 在Java中实现验证码生成,通常涉及到以下几个核心知识点: 1. **随机数生成**...
验证码生成在IT行业中是一项重要的安全技术,主要用于防止自动化的机器人程序或者恶意用户进行非法操作,如批量注册、恶意登录等。本压缩包提供了一个基于Java的验证码生成解决方案,包括了必要的库文件,如jcaptcha...
这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...
本程序是采用Windows GDI+技术模拟Web上的验证码生成而设计的一款Windows版验证码随机生成程序,利用GDI+图形图像处理技术,可随机生成强验证码(即汉字验证码)或弱验证码(即数字和字母组合验证码),支持验证码的...
基于Springboot+VUE 的前后端分离式谷歌验证码生成器后台代码 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信...
本压缩包"安卓验证码相关-android本地验证码生成.rar"包含了一些关于在Android平台上实现本地验证码生成的源码和资料。下面将详细介绍验证码的原理以及如何在Android中实现。 验证码的原理: 验证码是一种“全自动...
对于这个验证码生成类,readme.md可能会详细解释如何配置字体目录、如何引入类文件、示例代码以及可能出现的问题和解决方案。 通过以上方法,我们可以构建一个具有较高安全性的PHP验证码生成类,有效防止自动化攻击...
在网络安全领域,验证码(CAPTCHA)是一种用于验证用户是否为人类的工具,它通常用于防止自动脚本或机器人...同时,这个项目也为你提供了一个实战平台,可以尝试优化现有的验证码生成和识别算法,以应对更复杂的挑战。
这个“一个php验证码生成类代码.zip”压缩包中包含了一个PHP验证码生成类,它能够帮助开发者轻松地创建具有背景、干扰元素和随机文本的图像验证码。 验证码类通常包括以下几个核心功能: 1. **生成随机字符串**:...
本篇文章将详细讲解基于JavaScript(js)实现的表单验证码生成技术,以及如何自定义字符并创建高效实例。 验证码的核心功能是生成一组随机的、难以被程序自动识别的字符序列,通常包括字母、数字、甚至图形。...
标题中的"dotnet-HeiCaptcha"是一个专为.NET Core设计的图形验证码生成库,强调了其跨平台的特性。这意味着它不仅能在Windows系统上运行,还能在Linux或macOS等其他支持.NET Core的平台上工作。"HeiCaptcha"这个名字...
验证码生成是一种常见的安全措施,用于防止自动化程序(如机器人)对网站进行恶意操作,例如注册、登录或提交表单。验证码通常包含随机生成的一串字符,可能是数字、字母或者符号,用户需要正确输入这些字符才能完成...
本篇将详细探讨“轻量级验证码生成工具”——一个基于Java的验证码生成插件。 该插件设计的目标是轻便且易于集成,它内置了四种不同的验证码样式,可以满足各种应用场景的需求。这些样式可能包括不同颜色、字体、...
本文将详细介绍如何使用C#自动生成Web图形验证码,以及提供一个简单的5位数字验证码生成示例。 首先,理解验证码的基本概念:验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and...
Java模拟QQ样式验证码生成器是一种基于Java编程语言实现的工具,用于创建类似于QQ应用程序中使用的验证码。QQ验证码通常具有特定的样式,包括扭曲的文字、颜色干扰以及背景元素,旨在增加机器识别的难度,同时保证...