孙晋海优秀作者
原创内容 来源:小居数码网 时间:2024-08-14 11:58:01 阅读() 收藏:47 分享:41 爆
导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有1640个文字,大小约为6KB,预计阅读时间5分钟。
介绍语
本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!
望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊
如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。
正文:
在登录中页面为什么需要一个验证码?装比呗,哈哈哈。你信吗?我整理了下自己用的验证码工具类,码友们可以直接使用,也可以进一步改进优化,再用于自己的项目中。
程序员不会表达,直接上干货把。
直接保存验证码图片到本地
模拟浏览器获取验证码和校验验证码
工具类源码:
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代码)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
(472)个朋友认为回复得到帮助。
部分文章信息来源于以及网友投稿,转载请说明出处。
本文标题:java实现验证码功能(生成验证码的java代码):http://sjzlt.cn/shuma/155491.html