-
2017-12-23 15:17:32package com.cms.yzm;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* <b style="color:red">
* 描述: 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。
* 支持自定义验证码字符数量;
* 支持自定义验证码图片的大小;
* 支持自定义需排除的特殊字符;
* 支持自定义干扰线的数量;
* 支持自定义验证码图文颜色
* </b>
* @author ChenZhou_cms
* @category 验证码生成器类
*/
public class VerifyCodeImgUtil {
/**
* 验证码类型为数字、大写字母、小写字母混合
*/
public static final int TYPE_ALL_MIXED=2;
private VerifyCodeImgUtil(){}
/**
* 生成验证码字符串
* @param type 验证码类型,参见本类的静态属性
* @param length 验证码长度,大于0的整数
* @param exChars 需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null)
* @return 验证码字符串
*/
public static String generateTextCode(int type,int length,String exChars){
if(length<=0) return "";
StringBuffer code=new StringBuffer();
int i=0;
Random r=new Random();
switch(type)
{
case TYPE_ALL_MIXED:
while(i<length){
int t=r.nextInt(123);//返回值是0~123
if((t>=97||(t>=65&&t<=90))&&(exChars==null||exChars.indexOf((char)t)<0)){
code.append((char)t);
i++;
}
}
break;
}
return code.toString();
}
/**
* 已有验证码,生成验证码图片
* @param textCode 文本验证码
* @param width 图片宽度
* @param height 图片高度
* @param interLine 图片中干扰线的条数
* @param randomLocation 每个字符的高低位置是否随机
* @param backColor 图片颜色,若为null,则采用随机颜色
* @param foreColor 字体颜色,若为null,则采用随机颜色
* @param lineColor 干扰线颜色,若为null,则采用随机颜色
* @return 图片缓存对象
*/
public static BufferedImage generateImageCode(String textCode,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){
BufferedImage bim=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=bim.getGraphics();
//画背景图
g.setColor(backColor==null?getRandomColor():backColor);
g.fillRect(0,0,width,height);
//画干扰线
Random r=new Random();
if(interLine>0){
int x=0,y=0,x1=width,y1=0;
for(int i=0;i<interLine;i++){
g.setColor(lineColor==null?getRandomColor():lineColor);
y=r.nextInt(height);
y1=r.nextInt(height);
g.drawLine(x,y,x1,y1);
}
}
//写验证码
//g.setColor(getRandomColor());
//g.setColor(isSimpleColor?Color.BLACK:Color.WHITE);
//字体大小为图片高度的80%
int fsize=(int)(height*0.8);
int fx=height-fsize;
int fy=fsize;
g.setFont(new Font(Font.DIALOG,Font.PLAIN,fsize));
//写验证码字符
for(int i=0;i<textCode.length();i++){
fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;
g.setColor(foreColor==null?getRandomColor():foreColor);
g.drawString(textCode.charAt(i)+"",fx,fy);
fx+=fsize*0.9;
}
g.dispose();
return bim;
}
/**
* 生成图片验证码
* @param type 验证码类型,参见本类的静态属性
* @param length 验证码字符长度,大于0的整数
* @param exChars 需排除的特殊字符
* @param width 图片宽度
* @param height 图片高度
* @param interLine 图片中干扰线的条数
* @param randomLocation 每个字符的高低位置是否随机
* @param backColor 图片颜色,若为null,则采用随机颜色
* @param foreColor 字体颜色,若为null,则采用随机颜色
* @param lineColor 干扰线颜色,若为null,则采用随机颜色
* @return 图片缓存对象
*/
public static BufferedImage generateImageCode(int type,int length,String exChars,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){
String textCode=generateTextCode(type,length,exChars);
BufferedImage bim=generateImageCode(textCode,width,height,interLine,randomLocation,backColor,foreColor,lineColor);
return bim;
}
/**
* 随机生成颜色
* @return
*/
private static Color getRandomColor(){
Random r=new Random();
Color c=new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255));
return c;
}
}
更多相关内容 -
JAVA动态生成验证码的JAVA实现的代码
2017-12-15 15:19:51验证码是JAVA代码自动的生成绘制,适合不用JS写验证码,实现的功能更好 -
java验证码生成代码
2013-08-19 14:27:01java中验证码的生成代码工具类,/** * 验证码生成工具类! */ -
java 随机生成6位短信验证码实例代码
2020-08-25 06:41:28主要介绍了java 随机生成6位短信验证码的实例代码,文中给大家扩展介绍了java随机生成四位数字验证码的方法,需要的朋友可以参考下 -
java captcha(验证码)生成
2019-04-06 01:07:56NULL 博文链接:https://godo121.iteye.com/blog/1542224 -
java随机验证码生成实现实例代码
2020-08-30 15:47:51主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下 -
java生成图片验证码实例代码
2020-09-02 12:47:46主要介绍了java生成图片验证码实例代码,验证码的种类有很多,问题验证、短信验证还有常见的图片验证,本文就为大家介绍生成图片验证码最简单方法,感兴趣的小伙伴们可以参考一下 -
JAVA实现验证码(完整代码)
2013-05-07 10:20:27JAVA实现验证码(完整代码),一个完整地验证码例子。 -
浅析Java验证码生成库JCaptcha
2020-09-01 22:44:46JCaptcha 是一个用来生成验证码的开源Java类库,使用起来也是非常的简单方便。本文通过代码实例介绍了JCaptcha类库。 -
java实现验证码生成
2020-06-08 14:40:39* 获取验证码 * @param model * @param request * @param response * @param session */ @ResponseBody @RequestMapping(value = "/getCaptcha") public void verificationCode.../** * 获取验证码 * @param model * @param request * @param response * @param session */ @ResponseBody @RequestMapping(value = "/getCaptcha") public void verificationCode(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response,HttpSession session) { StringBuffer randBuffer = new StringBuffer(); for (Integer i = 1; i <= 4; i++) { randBuffer.append(new Random().nextInt(10)); } String rand = randBuffer.toString(); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-store"); response.setDateHeader("Expires", 0L); //设置验证码保存的时间 response.setHeader("Pragma", "no-cache"); session.setAttribute("vcode", rand); //记住验证码 try { createCodeUtil vcodeService = new createCodeUtil(); ImageIO.write((RenderedImage) vcodeService.drawRandNumber(rand), "JPEG", response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } }
工具类
package com.test.util; import java.awt.*; import java.awt.image.BufferedImage; import java.io.Serializable; import java.util.Random; public class createCodeUtil implements Serializable{ private int width = 40; private int height = 20; private String fontName = "Times New Roman"; private int fontSize = 14; private static BufferedImage image = new BufferedImage(40, 20, 1); /* (non-Javadoc) * @see com.baoz.zhouzhou.service.impl.IVcodeService#drawRandNumber(java.lang.String) */ public synchronized Image drawRandNumber(String rand) { Graphics g = image.getGraphics(); refreshBgColor(g); g.setFont(new Font(fontName, 0, fontSize)); g.setColor(getRandColor(0, 120)); g.drawString(rand, 6, 16); g.dispose(); return image; } private static Random RANDOM = new Random(); private void refreshBgColor(Graphics g) { g.fillRect(0, 0, width, height); g.setColor(getRandColor(160, 200)); for (int i = 0; i < 100; i++) { int x = RANDOM.nextInt(width); int y = RANDOM.nextInt(height); int xl = RANDOM.nextInt(12); int yl = RANDOM.nextInt(12); // g.drawLine(x, y, x + xl, y + yl); } } private Color getRandColor(int fc, int bc) { if (fc > 255) { fc = 255; } if (bc > 255) { bc = 255; } int r = fc + RANDOM.nextInt(bc - fc); int g = fc + RANDOM.nextInt(bc - fc); int b = fc + RANDOM.nextInt(bc - fc); return new Color(r, g, b); } public void setFontName(String fontName) { this.fontName = fontName; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public void setHeight(int height) { this.height = height; image = new BufferedImage(width, height, 1); } public void setWidth(int width) { this.width = width; image = new BufferedImage(width, height, 1); } public static void main(String[] args) { } }
最终效果
-
基于Java随机生成手机短信验证码的实例代码
2020-08-26 02:53:07主要介绍了Java随机生成手机短信验证码的实例代码,代码分为哦简单版和复杂版,需要的朋友可以参考下 -
JAVA—生成验证码的两种方法(代码+运行结果+总结)
2022-03-23 22:37:39提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要...文章目录
前言
利用java语言基础语句生成所需要的验证码
一、Random随机生成数方法生成验证码
1.代码+详细注释:
package String类常用API; import java.util.ArrayList; import java.util.Random; public class 验证码的几种生成方法 { public static void main(String[] args) { //1,用随机生成数方法,生成验证码 Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 String yzm2 = ""; //定义一个空的Atring变量用来接收生成的验证码 for (int i = 0; i < 5; i++) { //循环5次每次生成一位,5位验证码 int a = yzm.nextInt(3); //验证码包括数字、大小写字母组成 switch(a){ //a: 0 1 2 case 0: // 数字 小写字母 大写字母 char s=(char)(yzm.nextInt(26)+65); yzm2 = yzm2 + s; break; case 1: char s1=(char)(yzm.nextInt(26)+97); yzm2 = yzm2 + s1; break; case 2: int s2=yzm.nextInt(10); yzm2 = yzm2 + s2; break; } } System.out.println("用随机生成数方法,生成的验证码:"+yzm2); } }
2 、运行结果:
二、用String常用API-charAit生成验证码
1.代码+详细注释:
package String类常用API; import java.util.ArrayList; import java.util.Random; public class 验证码的几种生成方法 { public static void main(String[] args) { Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 //2,用String常用API-charAit生成验证码 String yzm1 = "1234567890abcdefghijklmnopqrstuvwxwzABCDEFGHIJKLMNOPQRSTUVWXYZ";//定义一个String变量存放需要的数据,一共58位 String yzm3 = "";//定义一个空的Atring变量用来接收生成的验证码 for (int i = 0; i < 5; i++) { int a = yzm.nextInt(58);//随机生成0-57之间的数,提供索引位置 yzm3+=yzm1.charAt(a);//用get 和提供的索引找到相应位置的数据给变量 } System.out.println("用String常用API-charAit生成的验证码为:"+yzm3); } }
2.运行结果
总结
以上就是今天要讲的内容,本文仅仅简单介绍了用java语言生成验证码的两种方法,String-charAit方法较为易懂,利用索引获取该位置字符接到空字符串完成验证码的生成,Random随机生成数方法生成验证码则是利用switch语句完成验证码生成。 -
Java生成验证码源代码
2018-11-01 19:36:55在看崔老师的javaweb视频,第十二节课,看了源代码,自己动手写了写,有些地方和老师给的源码不同,比如获取字体那块,老师返回的是Color类型(直接设置了font,style,size),我返回的是字体名字(String) 附上自己写的...在看崔老师的javaweb视频,第十二节课,看了源代码,自己动手写了写,有些地方和老师给的源码不同,比如获取字体那块,老师返回的是Color类型(直接设置了font,style,size),我返回的是字体名字(String)
附上自己写的源代码
VerifyCode.java
package cn.edou.image; 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.FileOutputStream; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; public class VerifyCode { //定义一些变量 private int x = 200; private int y = 80; private int fontSize = 70; private StringBuilder sb = new StringBuilder(); private Random random = new Random(); private Color bgColor = new Color(255,255,255); private String[] fontsName = {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}; private String codes = "23456789abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ"; //获取随机的字体 private String getFont(){ int index = random.nextInt(fontsName.length); String fontName = fontsName[index]; return fontName; } //获取字母 private String getChar(){ int index = random.nextInt(codes.length()); String ch = codes.charAt(index)+""; return ch; } //获取颜色 private Color getColor(){ int red = random.nextInt(150); int green = random.nextInt(150); int blue = random.nextInt(150); return new Color(red,green,blue); } //设置缓冲区 private BufferedImage getBufferedImage(){ BufferedImage bi = new BufferedImage(x,y,BufferedImage.TYPE_INT_RGB); Graphics2D pen = (Graphics2D)bi.getGraphics(); pen.setColor(this.bgColor); pen.fillRect(0,0,x,y); return bi; } //给缓冲区添加字符串,添加干扰线 private BufferedImage addCharAndLine(){ BufferedImage bi = getBufferedImage(); Graphics2D pen = (Graphics2D)bi.getGraphics(); for(int i=0;i<4;i++){ String font = getFont(); int style = random.nextInt(4); pen.setColor(getColor()); pen.setFont(new Font(font,style,fontSize)); String s = getChar(); sb.append(s); pen.drawString(s, 10+i*50, 65); } int lineNumber = 3; pen.setColor(Color.BLUE); // pen.setStroke(new BasicStroke(1.5F)); pen.setStroke(new BasicStroke(1.5F,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER)); for(int i=0;i<lineNumber;i++){ int x1 = random.nextInt(x); int y1 = random.nextInt(y); int x2 = random.nextInt(x); int y2 = random.nextInt(y); pen.drawLine(x1, y1, x2, y2); } return bi; } //获取验证码的值 public String getText(){ return sb.toString(); } //获取一张验证码图片 public BufferedImage getImage(){ return addCharAndLine(); } //输出图片 public void outputImage(BufferedImage bi,String imageName){ String path = "D:\\JavaWebExercise\\day12\\"+imageName+".jpg"; try { ImageIO.write(bi, "JPEG", new FileOutputStream(path)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
附上老师的源码
package cn.itcast.image; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; 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(); // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"} private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"}; // 可选字符 private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; // 背景色 private Color bgColor = new Color(255, 255, 255); // 验证码上的文本 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);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体) int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28 return new Font(fontName, style, size); } // 画干扰线 private void drawLine (BufferedImage image) { int num = 3;//一共画3条 Graphics2D g2 = (Graphics2D)image.getGraphics(); for(int i = 0; i < num; i++) {//生成两个点的坐标,即4个值 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);//画线 } } // 随机生成一个字符 private char randomChar () { int index = r.nextInt(codes.length()); return codes.charAt(index); } // 创建BufferedImage private BufferedImage createImage () { BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0, 0, w, h); return image; } // 调用这个方法得到验证码 public BufferedImage getImage () { BufferedImage image = createImage();//创建图片缓冲区 Graphics2D g2 = (Graphics2D)image.getGraphics();//得到绘制环境 StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本 // 向图片中画4个字符 for(int i = 0; i < 4; i++) {//循环四次,每次生成一个字符 String s = randomChar() + "";//随机生成一个字母 sb.append(s); //把字母添加到sb中 float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标 g2.setFont(randomFont()); //设置随机字体 g2.setColor(randomColor()); //设置随机颜色 g2.drawString(s, x, h-5); //画图 } this.text = sb.toString(); //把生成的字符串赋给了this.text drawLine(image); //添加干扰线 return image; } // 返回验证码图片上的文本 public String getText () { return text; } // 保存图片到指定的输出流 public static void output (BufferedImage image, OutputStream out) throws IOException { ImageIO.write(image, "JPEG", out); } }
想生成的话可以创建一个java文件来调用其中的方法,最后输出到指定的目录,在这里我指定的是D盘符,文件名自己给出,不用给后缀(第一个代码)
最后给出一个测试类,大家看看效果
@Test public void testVerifyCode(){ VerifyCode vc = new VerifyCode(); BufferedImage bi = vc.getImage(); vc.outputImage(bi, "test2"); System.out.println(vc.getText()); }
最后一张图片是没有任何效果的,可以无视
-
java验证码生成具体代码
2020-09-02 11:13:11主要为大家分享了java验证码生成具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java生成验证码并进行验证
2021-03-21 11:05:01并将绘制在图片上的验证码存放到session中用于后续验证最后通过ImageIO将生成的图片进行输出通过页面提交的验证码和存放在session中的验证码对比来进行校验二、生成验证码页面通过访问servlet来生成验证码,servlet... -
java登录验证码生成代码
2011-04-26 18:50:25一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片 -
Java验证码图片生成代码
2020-08-31 05:12:23主要为大家详细介绍了Java验证码图片生成代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java验证码自动生成代码
2016-05-01 11:21:01利用java自动生成验证码,是图片的格式哦 -
后台java 实现验证码生成
2018-11-05 18:23:55后台实现验证码生成 效果图如下: 1.适用需求 后台生成验证码,用于登陆验证。 2. 功能实现所需控件/文件: 无(普通标签) 3.功能点实现思路 1)前台思路: (1)前台一个<input&... -
Java制作验证码的完整代码
2020-11-04 23:57:57JAVA代码制作验证码,可用于注册等功能页面 要导入servlet-api.jar包 创建验证码的Util工具类: 先创建图片并生成随机的验证码字母 设置图片的底色,并用setFont函数将验证码画在图片上,如果想让验证码难一点,... -
JAVA手机验证码的生成简单实现
2022-04-02 23:05:12//利用哈希值生成验证码 int hash =tele.hashCode(); //加密 int encryption= 2020666; //用hash异或上加密得到生成第一次加密结果 //这个生成的加过永远是固定的如果加密码不动的情况下 long result= hash ^... -
java实现简单验证码生成
2021-03-22 18:29:16简单验证码java实现--servlet类生成 验证码img,并写入session老师给的源码,在此做个记录,简单验证码,java绘图在此鸣谢并附上源码:.//package app61;import java.io.*;import java.util.*;import ... -
java 生成图片验证码
2016-07-07 10:38:22java 生成图片验证码 带干扰线等 -
java生成随机图片验证码
2020-08-25 06:53:00主要为大家详细介绍了java生成随机图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java验证码生成工具类(简洁高效)
2020-11-04 18:31:56网上的代码结合自己的修改写出了这个验证码生成工具类,只生成字符形式的。 import java.security.SecureRandom; import java.util.Random; /** * 验证码生成工具类 */ public class VerifyCodeUtils { /** * ... -
java实现随机生成验证码图片
2020-08-25 06:54:02主要为大家详细介绍了java实现随机生成验证码图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java实现随机验证码具体代码
2020-08-31 19:02:46主要为大家详细介绍了Java实现随机验证码具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Java后端产生验证码后台验证功能的实现代码
2020-08-25 21:33:29主要介绍了Java后台产生验证码后台验证功能,本文文字结合实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 -
java生成图片验证码的代码
2021-03-06 18:39:36java生成验证码图片的代码案例:publicclassAuthImgextendsHttpServlet{/****/privatestaticfinallongserialVersionUID=4975974534946437434L;//设置图形验证码字符串的字体和大小privateFontmFont=newFont("微软...
收藏数
26,529
精华内容
10,611