验证码,java
这几天打算写一个验证码出来
遇到了几个问题
imageio写入失败:原因我创建文件的时候是先建立一个text文本,然后修改后缀,图片写不进去,还有没有编译
图像扭曲:粘连的问题,目前解决图像扭曲的问题,粘连没有找到算法
抗锯齿:g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //抗锯齿设置,对图像扭曲的时候还要再次设置抗锯齿不然没用
把各种形式的验证码分开来:例如纯数字,数字英文混合等等,消除o0,l1等模糊字符
git要发布至github是选中项目push上去,commit只会提交到本地
代码目前还有问题。。。。。。。。。生成的字符数会少一个,被遮挡住了,字体是强制设置
效果图:aaarticlea/png;base64,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" alt="" />
package com.validate.tool; /**
* @author
* @version 1.0
* */
public class CodeType {
public static final int CODE_TYPE_NUM = 1;//验证码为纯数字
public static final int CODE_TYPE_B_LETTER = 2;//验证码为纯大写字母
public static final int CODE_TYPE_S_LETTER = 3;//验证码为纯小写字母
public static final int CODE_TYPE_B_N_LETTER_N = 4;//验证码为大写字母与数字混合,不开启模糊
public static final int CODE_TYPE_B_N_LETTER_V = 5;//验证码为大写字母与数字混合,开启模糊
public static final int CODE_TYPE_S_N_LETTER_N = 6;//验证码为小写字母与数字混合,不开启模糊
public static final int CODE_TYPE_S_N_LETTER_V = 7;//验证码为小写字母与数字混合,开启模糊
public static final int CODE_TYPE_B_S_N_LETTER_N = 8;//验证码为大小写字母数字混合,不开启模糊
public static final int CODE_TYPE_B_S_N_LETTER_V = 9;//验证码为大小写字母数字混合,开启模糊 }
package com.validate.tool; import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.Serializable; public class ImgInfo implements Serializable{
/**
* @author
* @version 1.0
* */ private Integer codeNum;//验证码数量
private Integer codeType;//验证码类型:纯数字、字母等
private Integer lineNum;//干扰线
private String font;//字体
private Integer imgType;//图片类型
private boolean openSingleCase;//是否需要单例 private BufferedImage bufferedImage;//返回的图片缓存
private int fontSize;//图片文字大小
private String code; public Integer getCodeNum() {
return codeNum;
}
public void setCodeNum(Integer codeNum) {
this.codeNum = codeNum;
}
public Integer getLineNum() {
return lineNum;
}
public void setLineNum(Integer lineNum) {
this.lineNum = lineNum;
} public boolean isOpenSingleCase() {
return openSingleCase;
}
public void setOpenSingleCase(boolean openSingleCase) {
this.openSingleCase = openSingleCase;
}
public Integer getImgType() {
return imgType;
}
public void setImgType(Integer imgType) {
this.imgType = imgType;
}
public Integer getCodeType() {
return codeType;
}
public void setCodeType(Integer codeType) {
this.codeType = codeType;
}
public String getFont() {
return font;
}
public void setFont(String font) {
this.font = font;
} public BufferedImage getBufferedImage() {
return bufferedImage;
}
public void setBufferedImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
} public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
} public int getFontSize() {
return fontSize;
}
public void setFontSize(int fontSize) {
this.fontSize = fontSize;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
} }
package com.validate.tool; /**
* @author
* @version 1.0
* 获取各种随机数
*
* */
public class Random implements RandomBase{ private static final String[] B_S_N_LETTER_V = { "1", "3", "4", "5", "6", "7", "8",//开启后的字符串,大小写混合
"9", "a", "b", "c", "d", "e", "f", "i", "j", "k", "m", "n", "p",
"q", "r", "s", "t", "u", "v", "w", "x", "y", "A", "B", "C", "D",
"E", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y" }; private static final String[] B_S_N_LETTER_N = {"1", "3", "4", "5", "6", "7", "8",//不开启的字符串,大小写混合
"9","0", "a", "b", "c", "d", "e", "f","g","h", "i", "j", "k", "m", "n","o", "p",
"q", "r", "s", "t", "u", "v", "w", "x", "y","z", "A", "B", "C", "D",
"E", "F", "G", "H", "J", "K", "M", "N", "P", "O","Q", "R", "S", "T",
"U", "V", "W", "X", "Y","Z"}; private static final Integer[] NUM = {1,2,3,4,5,6,7,8,9,0};//纯数字的验证码 private static final String[] S_LETTER = {//小写字母
"a", "b", "c", "d", "e", "f","g","h", "i", "j", "k", "m", "n","o", "p",
"q", "r", "s", "t", "u", "v", "w", "x", "y","z"}; private static final String[] B_LETTER = {"A", "B", "C", "D",//大写字母
"E", "F", "G", "H", "J", "K", "M", "N", "P", "O","Q", "R", "S", "T",
"U", "V", "W", "X", "Y","Z"}; private static final String[] B_N_LETTER_V = {//大写字母与数字混合,开启模糊
"1", "3", "4", "5", "6", "7", "8","9","A", "B", "C", "D",
"E", "F", "G", "H", "J", "K", "M", "N", "P", "O","Q", "R", "S", "T",
"U", "V", "W", "X", "Y"
}; private static final String[] B_N_LETTER_N = {//大写字母与数字混合,关闭模糊
"1", "3", "4", "5", "6", "7", "8","9","0","A", "B", "C", "D",
"E", "F", "G", "H","I", "J", "K", "M", "N", "P", "O","Q", "R", "S", "T",
"U", "V", "W", "X", "Y","Z"
}; private static final String[] S_N_LETTER_V = {//小写字母与数字混合,开启模糊
"1", "3", "4", "5", "6", "7", "8","9","0",
"a", "b", "c", "d", "e", "f", "i", "j", "k", "m", "n", "p","q", "r", "s", "t", "u", "v", "w", "x", "y"
}; private static final String[] S_N_LETTER_N = {//小写字母与数字混合,关闭模糊
"1", "3", "4", "5", "6", "7", "8","9","0",
"a", "b", "c", "d", "e", "f","g","h", "i", "j", "k", "m", "n","o", "p","q", "r", "s", "t", "u", "v", "w", "x", "y","z"
}; private static volatile Random random = null;//是否使用单例模式 // public Random()//默认单例模式打开
// {
// if(random == null)
// {
// synchronized (Random.class) {
// if(random == null)
// {
// random = new Random();//内存溢出
// }
// }
// }
// }
//
// public Random(boolean notOpenSingleCase)//是否打开单例模式,true打开单例模式,false不使用单例模式
// {
// if(notOpenSingleCase == false)//不开单例模式
// {
//
// }
// } public static Random getInstance(boolean openSingleCase)//是否开启单例模式,是否开启字母字符,0o区分默认开启
{
if(openSingleCase == true)//开启单例模式
{
if(random == null)
{
synchronized (Random.class) {
random = new Random();
}
}
}else//不开启单例模式
{
return new Random();
} return random;
} public String get(Integer length,int codeType) {
StringBuffer stringBuffer = new StringBuffer(); switch (codeType) {
case CodeType.CODE_TYPE_NUM://纯数字
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(NUM.length);
stringBuffer.append(NUM[n]);
}
break;
case CodeType.CODE_TYPE_B_LETTER://纯大写字母
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(B_LETTER.length);
stringBuffer.append(B_LETTER[n]);
}
break;
case CodeType.CODE_TYPE_S_LETTER://纯小写字母
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(S_LETTER.length);
stringBuffer.append(S_LETTER[n]);
}
break;
case CodeType.CODE_TYPE_B_N_LETTER_N://大写字母与数字混合,不开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(B_N_LETTER_N.length);
stringBuffer.append(B_N_LETTER_N[n]);
}
break;
case CodeType.CODE_TYPE_B_N_LETTER_V://大写字母与数字混合,开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(B_N_LETTER_V.length);
stringBuffer.append(B_N_LETTER_V[n]);
}
break;
case CodeType.CODE_TYPE_S_N_LETTER_N://小写字母与数字混合,不开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(S_N_LETTER_N.length);
stringBuffer.append(S_N_LETTER_N[n]);
}
break;
case CodeType.CODE_TYPE_S_N_LETTER_V://小写字母与数字混合,开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(S_N_LETTER_V.length);
stringBuffer.append(S_N_LETTER_V[n]);
}
break;
case CodeType.CODE_TYPE_B_S_N_LETTER_N://小写字母与数字混合,开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(B_S_N_LETTER_N.length);
stringBuffer.append(B_S_N_LETTER_N[n]);
}
break;
case CodeType.CODE_TYPE_B_S_N_LETTER_V://小写字母与数字混合,开启模糊
for(int i = 1; i <= length; i++) {
java.util.Random random = new java.util.Random();
int n = random.nextInt(B_S_N_LETTER_V.length);
stringBuffer.append(B_S_N_LETTER_V[n]);
}
break;
default:
break;
} // if(vague == true)//开启
// {
// for (int i = 1; i <= length; i++) {
// java.util.Random random = new java.util.Random();
// int n = random.nextInt(50);
// stringBuffer.append(rBase[n]);
// }
// }else
// {
// for (int i = 1; i <= length; i++) {
// java.util.Random random = new java.util.Random();
// int n = random.nextInt(58);
// stringBuffer.append(rBaseVague[n]);
// }
// } return stringBuffer.toString(); } }
package com.validate.tool; /**
* @author
* @version 1.0
* */
public interface RandomBase { public String get(Integer length ,int codeType);
}
package com.validate.tool; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File; import javax.imageio.ImageIO; public class RandomImg{ private static volatile RandomImg randomImg = null; private RandomImg(){} public RandomImg getInstance(boolean openSingleCase)
{
if(openSingleCase == true)//开启单例模式
{
if(randomImg == null)
{
synchronized (RandomImg.class) {
if(randomImg == null)
{
randomImg = new RandomImg();
}
}
}
}else//不开启单例模式
{
return new RandomImg();
}
return randomImg;
} public ImgInfo getImg(ImgInfo imgInfo)throws Exception
{ int x = 0,codeY=0;
int red = 0, green = 0, blue = 0; x = imgInfo.getFontSize();//每个字符的宽度 codeY = imgInfo.getFontSize(); //y轴的维度为字体大小
int imgWidth = imgInfo.getFontSize()*imgInfo.getCodeNum()+20;//图片宽度
int imgHeight = imgInfo.getFontSize();//图片高度 BufferedImage buffereedImage = new BufferedImage(imgWidth, imgHeight, imgInfo.getImgType()); Random random = new Random().getInstance(imgInfo.isOpenSingleCase()); String code = random.get(imgInfo.getCodeNum(),imgInfo.getCodeType()); imgInfo.setCode(code);//得到随机字符串 Graphics2D graphics2D = buffereedImage.createGraphics(); graphics2D.setColor(Color.WHITE);//画布沾取白色 graphics2D.fillRect(0, 0, imgWidth, imgHeight);//填充矩形 Font font = new Font("Arial", imgInfo.getFontSize(), imgInfo.getFontSize()); graphics2D.setFont(font);
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //抗锯齿设置 java.util.Random randomBase = new java.util.Random(); for (int i = 0; i < imgInfo.getLineNum(); i++)//产生干扰线
{
int xs = randomBase.nextInt(imgWidth);
int ys = randomBase.nextInt(imgHeight);
int xe = xs+randomBase.nextInt(imgWidth/8);
int ye = ys+randomBase.nextInt(imgHeight/8);
red = randomBase.nextInt(255);
green = randomBase.nextInt(255);
blue = randomBase.nextInt(255);
graphics2D.setColor(new Color(red, green, blue));
graphics2D.drawLine(xs, ys, xe, ye); } for (int i = 0; i < imgInfo.getCodeNum(); i++) {//写入文字
String strRand = String.valueOf(code.charAt(i));
// 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
red = randomBase.nextInt(255);
green = randomBase.nextInt(255);
blue = randomBase.nextInt(255);
graphics2D.setColor(new Color(red, green, blue));
// graphics2D.drawString(strRand, (i + 1) * x-(int)(imgInfo.getFontSize()/1.2), codeY);
graphics2D.drawString(strRand, i>0?i * x+10:i*x-imgInfo.getFontSize()/*文字x轴文字*/, codeY-imgInfo.getFontSize()/8/*文字y轴文字*/); }
shearGraphics(graphics2D,imgWidth , imgHeight, Color.WHITE); imgInfo.setBufferedImage(buffereedImage);
return imgInfo; } public Graphics2D shearGraphics(Graphics2D graphics2D , int width , int height , Color color)
{
Graphics2D g = graphics2D;
shearX(g , width , height , color);
shearY(g,width , height,color);
return g;
} public void shearX(Graphics2D g,int w1,int h1,Color color)
{
java.util.Random randomBase = new java.util.Random();
int period = randomBase.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = randomBase.nextInt(2);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //抗锯齿设置
for(int i =0 ;i<h1;i++)
{
double d = (double)(period >> 1)*Math.sin((double)i/(double)period+(6.28318*(double)phase)/(double)frames);
g.copyArea(0, i, w1, 1, (int)d, 0);
if(borderGap){
g.setColor(color);
g.drawLine((int)d, i, 0, i);
g.drawLine((int)d+w1, i, w1, i);
}
}
} public void shearY(Graphics2D g , int w1 , int h1, Color color)
{
java.util.Random randomBase = new java.util.Random();
int period = randomBase.nextInt(40)+10;
boolean borderGap = true;
int frames = 20;
int phase = 7;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //抗锯齿设置
for(int i = 0;i< w1;i++){
double d = (double)(period>>1)*Math.sin((double)i/(double)period+(6.2831*(double)phase)/(double)frames);
g.copyArea(i, 0, 1, h1, 0, (int)d);
if(borderGap){
g.setColor(color);
g.drawLine(i, (int)d, i, 0);
g.drawLine(i, (int)d+h1, i, h1);
}
}
} public static void main(String[] args) throws Exception {
RandomImg randomImg = new RandomImg().getInstance(true); ImgInfo imginfo = new ImgInfo(); imginfo.setCodeNum(4);
imginfo.setCodeType(CodeType.CODE_TYPE_B_LETTER);
imginfo.setFont("");
imginfo.setFontSize(90); imginfo.setImgType(BufferedImage.TYPE_INT_RGB);
imginfo.setLineNum(23);
imginfo.setOpenSingleCase(true); randomImg.getImg(imginfo); File f = new File("E:/e.png"); ImageIO.write(imginfo.getBufferedImage(),"png", f); } }
迷茫了,大三。。。。现在开始放弃web前段,专心搞java,ssh,ssm,pl/sql、nosql,hadoop,其他的都不搞了。
验证码,java的更多相关文章
- 验证码 java实现的程序
makeCheckcode.java package pic; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- 移动端获取短信验证码java实现——阿里云短信服务
需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...
- 浏览器端获取短信验证码java实现——阿里云短信服务
需求:浏览器端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短 ...
- 使用阿里大于平台发送短信验证码java代码实现
待续..网站app后台还未完成,不能添加签名,短信不能正常发送. Tip: https://help.aliyun.com/document_detail/55284.html?spm=5176.sm ...
- JAVA生成验证码
<img border="0" src="ValidateCode" ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 课堂Java小程序(加减乘除与验证码)
一.编写一个程序,用户输入两个数,求出其加减乘除,并用消息框 显示计算结果. 1.设计思想:从键盘输入两个数字和运算符,然后计算.将输入的数字及运算符由字符型转换为整型,再用if判断输入的运算符,根据 ...
- JAVA图片验证码
package hh.com.util; import java.io.IOException; import javax.servlet.ServletException; import javax ...
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java制作验证码
建立一个web工程
随机推荐
- $[SHOI2007]$ 园丁的烦恼 二维数点/树状数组
\(Sol\) 设一个矩阵的左上角为\((x_1,y_1)\),右下角为\((x_2,y_2)\),\(s_{x,y}\)是到\((1,1)\)二维前缀和,那么这个矩阵的答案显然是\(s_{x_2,y ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
- 「Luogu P2508」[HAOI2008]圆上的整点 解题报告
题面 给定圆的半径,求圆上整点数 这是一道很Nice的数学题!超爱!好吧,由于这道题,我去Study了一下复数(complex number)复杂的数 真棒!!! 有兴趣的戳这里!!!\(\huge ...
- 1048 数字加密 (20 分)C语言
本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...
- Node.js 模块系统入门
在编程领域中,模块是自包含的功能单元,可以跨项目共享和重用.它们使开发人员的生活更加轻松,因为我们可以使用它来增加应用程序的功能,而不必亲自编写这些功能.它还让我们可以组织和解耦代码,从而使应用程序更 ...
- Java并发-几种常见的锁
这几天在忙着投提前批内推,前面看的好多东西没有总结,正好这两天补上顺带复习一下 synchronized:Java之重型锁
- TCP/IP协议与HTTP协议(二)
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据. 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过 ...
- 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第六节:第一境尾声
在第一境中,我们主要了解了爬虫的一些基本原理,说原理也行,说基础知识也罢,结果就是已经知道一个小爬虫是如何诞生的了~那么现在,请默默回想一下,在第一境中,您都掌握了哪些内容?哪些还比较模糊?如果还有什 ...
- MySQL——DOS命令
翻开之前的笔记发现有这么一篇,于是整理了一下发出来加深记忆并分享交流,欢迎纠错,谢谢!!! 1.启动MySQL服务: net start mysql; 2.停止MySQL服务: net stop my ...
- [3.0] 一个人开发一个App,小程序从0到1,删减添加
在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...