用Java实现验证码
时间:2021-07-14
本文章向大家介绍用Java实现验证码,主要包括用Java实现验证码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 写一个生成随机验证码的工具类
public class CodeImageUtil {
private static final char[] chars = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'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', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
// 字符数量
private static final int SIZE = 4;
// 干扰线数量
private static final int LINES = 5;
// 宽度
private static final int WIDTH = 100;
// 高度
private static final int HEIGHT = 40;
// 字体大小
private static final int FONT_SIZE = 30;
public static Object[] createImage(){
StringBuffer sb = new StringBuffer();
//创建空白图片
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
//获取图片画笔
Graphics graphics = image.getGraphics();
//设置画笔颜色
graphics.setColor(new Color(0xEDEDED));
//绘制矩形背景
graphics.fillRect(0,0,WIDTH,HEIGHT);
//画随机字符
Random random = new Random();
for (int i=0;i<SIZE;i++){
//获取随机字符索引
int j = random.nextInt(chars.length);
//设置随机颜色
graphics.setColor(getRandonColor());
//设置字体大小
graphics.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
//画字符
graphics.drawString(chars[j] + "",i * (WIDTH)/SIZE + 1,HEIGHT*2/3);
//记录字符
sb.append(chars[j]);
}
//画干扰线
for (int i = 0;i<LINES;i++){
//设置随机颜色
graphics.setColor(getRandonColor());
//随机画线
graphics.drawLine(random.nextInt(WIDTH),random.nextInt(HEIGHT),random.nextInt(WIDTH),random.nextInt(HEIGHT));
}
//返回验证码和图片
return new Object[]{sb.toString(),image};
}
/**
* 随机取色
*/
private static Color getRandonColor() {
Random random = new Random();
Color color = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
return color;
}
}
2. 使用工具类,将图片和随机的验证码返回
public void getCode(HttpServletResponse response, HttpSession session) throws IOException {
Object[] objs = CodeImageUtil.createImage();
String code = (String) objs[0];
BufferedImage image = (BufferedImage) objs[1];
OutputStream os = response.getOutputStream();
ImageIO.write(image,"png",os);
System.out.println(code);
session.setAttribute("Code",code);
}
原文地址:https://www.cnblogs.com/zheng-yi/p/15010115.html
- Android新手之旅(2) 新手问题
- Android新手之旅(2) 新手问题
- Android新手之旅(9) 自定义的折线图
- 2018春节抢票攻略:不仅仅是12306微信小程序启用
- Android新手之旅(9) 自定义的折线图
- Android新手之旅(11) 在现有页面中插入新的view
- Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)
- 温故而知新:Asp.Net中如何正确使用Session
- Android新手之旅(13) listview中数据重复的问题
- 温故而知新:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
- proxy_pass反向代理配置中url后面加不加/的说明
- Android新手之旅(10) 嵌套布局
- C#代码也VB
- Docker容器学习梳理--SSH方式登陆容器
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- JAVA|Java的Scanner类初级使用
- systemd设置nginx开机自启动
- C盘爆满,如何移除软件~
- Microsoft PowerToys
- MagicEXIF(元数据编辑器)
- 9个 SSH常用命令选项
- DietPi折腾记
- DietPi配置问题(1)
- DietPi配置问题(2)
- 什么是死锁?如何解决死锁?
- Mac终端配置oh-my-zsh
- 聊聊dubbo-go的leastActiveLoadBalance
- ThreadLocal与InheritableThreadLocal
- 每天学点JavaScript基础(1)—— null 和 undefined
- 每天学点JavaScript基础(2)——JavaScript里的分号,你加还是不加?