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.输出流,写出文件数据到服务器硬盘 ...
随机推荐
- ONNX源码安装
ONNX是facebook提出的一个 Open Neural Network Exchange协议,能够让训练好的模型在不同的框架间进行交互. ONNX的安装相对来说不是特别麻烦,麻烦的是其依赖库的安 ...
- php--常见算法2
<?php function zhi($number){ $f1=1; $f2=1; for($i=3;$i<=$number;$i++){ //前一个的前一个值+前一个值 $f3=$f1 ...
- Linux awk命令 --三剑客老大
Linux awk命令 --三剑客老大 基本用法: awk [参数] ['找谁{干啥}'] 文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...
- OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发
OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发 摘要: 记录实验过程中踩到的坑.介绍OPNsense防火墙的安装配置并搭建实验环境,利用msf的模块及ssh进行流量转发(LAN向DMZ ...
- raise与raise······from
在python中,如果想手动引发一个异常,我们一般都会使用raise # -*- coding:utf-8 -*- # @Author: WanMingZhu # @Date: 2019/10/22 ...
- deep_learning_Function_sklearn的train_test_split()
sklearn的train_test_split train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: X_tra ...
- 在python中,用默认参数(list,set,dict...)时要小心
在我们平时写需求的时候,如果没有了解到以下知识点,可能会出现这样的问题,掉进坑里面,甚至很难找到问题的根源.下面我们来看看使用可变默认参数(Mutable default arguments)时会出现 ...
- linux-Redhat7 windows物理机与虚拟机设置共享目录
一 windows物理机与虚拟机设置共享目录 1.1 WMware Workstation点击重新安装WMware Tools 此时会弹出在客户机装载 ...
- 【javascript】[].slice.call(arguments)的作用
var thisExtends = function () { var args = [].slice.call(arguments).filter(function (item) { return ...
- 同一电脑如何安装多个jdk
1.安装对应的jdk 本机测试只安装jdk1.7和1.8 2.切换jdk 以我的环境为例,一开始装的是jdk1.7,要切换到jdk1.8时,需修改以下内容 环境变量,该为对应jdk的bin路径 修改注 ...