「Java工具类」验证码工具类java生成验证码工具类
介绍语
本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!
望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊
如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。
正文:
在登录中页面为什么需要一个验证码?装比呗,哈哈哈。你信吗?我整理了下自己用的验证码工具类,码友们可以直接使用,也可以进一步改进优化,再用于自己的项目中。
程序员不会表达,直接上干货把。
使用例子1#
直接保存验证码图片到本地
使用例子2#
模拟浏览器获取验证码和校验验证码
工具类源码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
/**
* 验证码工具类
*
* @author liangxn
*/
public class VerifyCodeUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(VerifyCodeUtil.class);
private final int width = 200;
private final int height = 80;
private BufferedImage codeImg;
private final StringBuilder sb = new StringBuilder();
private final Random random = new Random();
private final Color bgColor = new Color(255, 255, 255);
private final String[] fontsName = {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"};
/**
* 生成code(第一步调用)
*/
public void generateCode(){
codeImg = addCharAndLine();
}
/**
* 获取验证码的值
*
* @return
*/
public String getText() {
return sb.toString();
}
/**
* 直接将验证码返回到浏览器
*
* @param response
*/
public void writeCodeToRespone(HttpServletResponse response) {
try {
// 设置输出流
response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
// 写入输出流中
ImageIO.write(codeImg, "JPEG", response.getOutputStream());
} catch (FileNotFoundException e) {
LOGGER.error("文件未发现异常", e);
} catch (IOException e) {
LOGGER.error("写验证码异常", e);
}
}
/**
* 生产验证码图片
*
* @return
*/
public void createVerifyCode(String imageName) {
String path = imageName + ".jpg";
try {
ImageIO.write(codeImg, "JPEG", new FileOutputStream(path));
} catch (FileNotFoundException e) {
LOGGER.error("文件未发现异常", e);
} catch (IOException e) {
LOGGER.error("写验证码异常", e);
}
}
/**
* 获取字体
*
* @return
*/
private String getFont() {
int index = random.nextInt(fontsName.length);
return fontsName[index];
}
/**
* 获取随机字符
*
* @return
*/
private String getChar() {
String codes = "0123456789abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
int index = random.nextInt(codes.length());
return codes.charAt(index) + "";
}
/**
* 获取字体颜色
*
* @return
*/
private Color getColor() {
int red = random.nextInt(150);
int green = random.nextInt(150);
int blue = random.nextInt(150);
return new Color(red, green, blue);
}
/**
* 生成图片缓存
*
* @return
*/
private BufferedImage getBufferedImage() {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D pen = (Graphics2D) bi.getGraphics();
pen.setColor(this.bgColor);
pen.fillRect(0, 0, width, height);
return bi;
}
/**
* 给验证码图片画字符和干扰线(包含有字符和线)
*
* @return
*/
private BufferedImage addCharAndLine() {
BufferedImage bi = getBufferedImage();
Graphics2D pen = (Graphics2D) bi.getGraphics();
// 把验证码画到图片上
for (int i = 0; i < 4; i++) {
String font = getFont();
// 生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
int style = random.nextInt(4);
pen.setColor(getColor());
int fontSize = 70;
pen.setFont(new Font(font, style, fontSize));
String s = getChar();
sb.append(s);
pen.drawString(s, 10 + i * 50, 65);
}
// 画3条干扰线
int lineNumber = 3;
pen.setColor(Color.BLUE);
pen.setStroke(new BasicStroke(1.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER));
for (int i = 0; i < lineNumber; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = random.nextInt(width);
int y2 = random.nextInt(height);
pen.drawLine(x1, y1, x2, y2);
}
return bi;
}
}
鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。
计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。
作者:Java夜未眠
出处:https://www.cnblogs.com/liangxianning/p/17058238.html
版权声明:本博客所有文章除特别声明外,均采用「 MIT 许可协议。」许可协议进行许可
关于博主: 评论和私信会可能回复较慢,点击上面加人图标加我为好友吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)