您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java生成随机图片验证码

时间:2019-12-11 10:30:47  来源:  作者:

今天跟大佬学了JAVA随机生成验证码,

开心Ing,,,,,

激动ing,,,

 

Java生成随机图片验证码

 

前台html代码

 <div style="margin-top: 50px;">
 <span>验证码:</span><input type="text" name="verifyCode" id="verifyCode" style="width: 75px;height: 25px;"/>
 <img id="verifyCodeImg" alt="点击更换" src="/qos/dog/getVerifyCodeImg"
 title="点击更换" onclick="change()">
 </div>

前台js代码

 function change() {
 var verifyCode = document.getElementById("verifyCodeImg");
 verifyCode.src = "/qos/dog/getVerifyCodeImg?time=" + Math.random(1000);
 }

 

 

 
/*-*/

 
/qos/dog/ 这里的路径是需要换成自己的哦

 

验证代码,在controller里面新建一个util文件夹,然后放入VerifyCodeUtil.java

代码如下

package com.paladin.qos.util;

 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

 
public class VerifyCodeUtil {

 
 private static final Random random = new Random();
 private static final String[] fontNames = {"宋体", "华文楷体", "黑体", "Georgia", "微软雅黑", "楷体_GB2312"};

 
 public static String drawImage(ByteArrayOutputStream output) {
 String code = "";
 int width = 50;
 int height = 25;

 
 //创建图片缓冲区
 BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);

 
 Graphics2D g = bi.createGraphics();

 
 //设置背景颜色
 g.setBackground(new Color(255, 255, 255));
 g.clearRect(0, 0, width, height);

 
 StringBuilder stringBuilder = new StringBuilder();
 //这里只画入四个字符
 for (int i = 0; i < 4; i++) {
 String s = randomChar() + ""; //随机生成字符,因为只有画字符串的方法,没有画字符的方法,所以需要将字符变成字符串再画
 stringBuilder.Append(s); //添加到StringBuilder里面
 float x = i * 1.0F * width / 4; //定义字符的x坐标
 g.setFont(randomFont()); //设置字体,随机
 g.setColor(randomColor()); //设置颜色,随机
 g.drawString(s, x, height - 5);
 }
 code = stringBuilder.toString();//获取验证码字符串

 
 //定义干扰线
 //定义干扰线的数量(3-5条)int num = random.nextInt(max)%(max-min+1) + min;
 int num = random.nextInt(5) % 3 + 3;
 Graphics2D graphics = (Graphics2D) bi.getGraphics();
 for (int i = 0; i < num; i++) {
 int x1 = random.nextInt(width);
 int y1 = random.nextInt(height);
 int x2 = random.nextInt(width);
 int y2 = random.nextInt(height);
 graphics.setColor(randomColor());
 graphics.drawLine(x1, y1, x2, y2);
 }
 // 释放图形上下文
 g.dispose();
 try {
 ImageIO.write(bi, "jpg", output);
 } catch (IOException e) {
 e.printStackTrace();
 }
 return code;//为了方便取值,直接返回code,

 

 

 
 }

 
 //随机字体
 private static Font randomFont() {
 int index = random.nextInt(fontNames.length);
 String fontName = fontNames[index];
 int style = random.nextInt(4); //随机获取4种字体的样式
 int size = random.nextInt(20) % 6 + 15; //随机获取字体的大小(10-20之间的值)
 return new Font(fontName, style, size);
 }

 
 //随机颜色
 private static Color randomColor() {
 int r = random.nextInt(225);
 int g = random.nextInt(225);
 int b = random.nextInt(225);
 return new Color(r, g, b);
 }

 

 
 //随机字符
 private static char randomChar() {
 //A-Z,a-z,0-9,可剔除一些难辨认的字母与数字
 String str = "0123456789ABCdefghiDEFGHIJopPQRVWXYZabcjklSTUmnqrstKLMNOvuwxyz";

 
 return str.charAt(random.nextInt(str.length()));
 }

 
}

最后,在controller里面引用

 @RequestMapping("/getVerifyCodeImg")
 @ResponseBody
 public void getVerifyCodeImg(HttpServletResponse response, HttpSession session) {
 ByteArrayOutputStream output = new ByteArrayOutputStream();
 String code = VerifyCodeUtil.drawImage(output);
 //将验证码文本直接存放到session中
 session.setAttribute("verifyCode", code);
 try {
 ServletOutputStream out = response.getOutputStream();
 output.writeTo(out);
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

 

————————————————

版权声明:本文为CSDN博主「小仙女de成长」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_32963841/article/details/103182827



Tags:Java 验证码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天跟大佬学了java随机生成验证码,开心Ing,,,,,激动ing,,, 前台html代码 <div style="margin-top: 50px;"> <span>验证码:</span><input type="text" name="verifyCode" id=...【详细内容】
2019-12-11  Tags: Java 验证码  点击:(79)  评论:(0)  加入收藏
功能包括:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,干扰线,噪点,背景扭曲。本来想做字符扭曲的,不知道怎的先生成文字再扭曲就报错了,先就这...【详细内容】
2019-08-20  Tags: Java 验证码  点击:(215)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条