java实现一个简单的验证码生成器
最近看了网上很多大佬们写的验证码生成,寻思着自己也写一个,话不多说,代码如下:
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 width = 90;
private int high = 40;
private Random random = new Random();
private String[] fonts = {"宋体", "微软雅黑", "TimesRoman", "Cambria"};
private String chars = "1234567890";
private String operator = "+-x";
private Color backColor = Color.white;
private String text;
private int no1;
private int no2;
private String op; //获取随机颜色
private Color randomColor()
{
int red = random.nextInt(150);
int green = random.nextInt(150);
int blue =random.nextInt(150);
return new Color(red,green,blue);
} //method:获取随机字体
private Font randomFont()
{
int index = random.nextInt(fonts.length);
String fontName = fonts[index];
int style = random.nextInt(4);
int size = 24+random.nextInt(4); return new Font(fontName,style,size);
}
//method:获取随机操作符号
private String randomOperator()
{
int index = random.nextInt(3);
return operator.charAt(2)+"";
} //method:获取随机数字
private String randomNum()
{
int index = random.nextInt(chars.length());
return chars.charAt(index)+"";
} //method:添加干扰线
private void drawLine(BufferedImage image)
{
int num = 3;
Graphics2D graphic = (Graphics2D)image.getGraphics();
for(int i=0;i<num;i++)
{
int x1 = random.nextInt(width);
int x2 = random.nextInt(width);
int y1 = random.nextInt(high);
int y2 = random.nextInt(high);
graphic.setColor(this.randomColor());
graphic.setStroke(new BasicStroke(1.5F));
graphic.drawLine(x1,y1,x2,y2);
}
}
//method:绘制方法
private void drawString(Graphics2D graphics,String s,float position)
{
graphics.setColor(randomColor());
graphics.setFont(randomFont());
graphics.drawString(s,position,high -5);
} //获取图片缓存
public BufferedImage getImage()
{
BufferedImage bi = new BufferedImage(width,high,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)bi.getGraphics();
g2.setColor(this.backColor);
g2.fillRect(0, 0, 90, 40);
StringBuilder sb = new StringBuilder(); //获取操作数s1,绘制
String s1 = randomNum();
this.no1 = Integer.parseInt(s1);
float p1 = 5.0F;
sb.append(s1);
drawString(g2,s1,p1); //获取操作符oper,绘制
String oper = randomOperator().trim();
this.op = oper;
sb.append(oper);
float p2 = 1.0F*width/5;
drawString(g2,oper,p2); //获取操作数s2,绘制
String s2 = randomNum();
this.no2 = Integer.parseInt(s2);
float p3 = 2.0F*width/5;
sb.append(s2);
drawString(g2,s2,p3); //绘制 等号和问号
String calculate = "=?";
float p4 = 3.0F*width/5;
drawString(g2,calculate,p4); //绘制干扰线
drawLine(bi); //返回BufferedImage图片
return bi;
} //获取算术的运算结果
public int getValue()
{
int value = 0;
switch(this.op)
{
case "+": value = this.no1+this.no2;break;
case "-": value = this.no1-this.no2;break;
case "x":value = this.no1*this.no2;break;
default :value = 0;
}
return value;
} //将图片缓存bi输出到指定的输出流out
public static void output(BufferedImage bi, OutputStream out)
throws FileNotFoundException, IOException
{
ImageIO.write(bi,"JPEG",out);
}
}
测试代码如下:
@Test
public void test1()
{
VerifyCode verifyCode = new VerifyCode();
BufferedImage bi = verifyCode.getImage(); FileOutputStream out;
try
{
out = new FileOutputStream("H:\\verifyCode.jpg");
VerifyCode.output(bi, out);
}catch (Exception e)
{
e.printStackTrace();
}
System.out.println(verifyCode.getValue());
}
生成的验证码图片如下:

程序输出结果如下:
18
以上,只实现了10以内的加减乘,除法都没有,毕竟作为验证码,除法还要考虑除数非0、整除等内容,因此未添加除法。各位看看就好,水平有限,请多多指教!
java实现一个简单的验证码生成器的更多相关文章
- Java 创建一个简单的验证码图片
代码如下: package lixin.gan.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- 使用 java 实现一个简单的 markdown 语法解析器
1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...
- java:jsp: 一个简单的自定义标签 tld
java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
- Java实现一个简单的网络爬虫
Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...
- Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统
一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
随机推荐
- 深入分析 Docker 镜像原理
摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...
- https和http的post发送总结
本文为转贴内容,感谢作者阿进! 需要转发数据到客户的https的服务器上出现一系列问题总结如下: 1.因为是https首先考虑到用最新的控件NetHTTPClient(只有在XE8以上才有). 2.客 ...
- 第十章、json和pickle模块
目录 第十章.json和pickle模块 一.序列化 二.json 三.pickle模块 第十章.json和pickle模块 一.序列化 把对象(变量)从内存中变成可存储或传输的过程称之为序列化, 序 ...
- centos7.3安装mysql5.7
一.写随笔的原因:最近在阿里云上买了个centos7.3服务器,想将一些demo运行在上面,所以需要做一些环境的安装,通过此篇文章MAKR一下.下面来记录下安装步骤(参考网上的一些教程,有坑的话会实时 ...
- 使用busybox1.21.1制作根文件系统
1. 下载源码 https://busybox.net/downloads/ 2. 解压 3. 修改Makefile ~/busybox-1.21.1$ vi Makefile 164行: 修改前:C ...
- SQL语句复习【专题六】
SQL语句复习[专题六] 用户 + 创建表 --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...
- 04-【servlet转发和重定向】
转发: //forward(将 数据传给下一个资源(servlet,jsp ,html等 ,把请求和响应的数据和参数设置带过去 ) request.getRequestDispatcher(" ...
- 记一次自启动的docker容器将宿主机的开机用户登录界面覆盖事件
宿主机的系统为CentOS7_7.7.1908,默认为GUI启动,安装了宝塔面板,docker-ce为最新版. 在启动了一个centos7的容器(镜像为centos官方镜像)后,将该容器重启策略设置为 ...
- gyp ERR! stack Error: EACCES: permission denied, mkdir问题解决方案
sudo npm i --unsafe-perm 原因还是权限问题 就是说 npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody ...
- Pursuit For Artifacts CodeForces - 652E (Tarjan+dfs)
Pursuit For Artifacts CodeForces - 652E Johnny is playing a well-known computer game. The game are i ...