java怎么实现随机验证码图片生成
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要介绍"java怎么实现随机验证码图片生成",在日常操作中,相信很多人在java怎么实现随机验证码图片生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"jav
千家信息网最后更新 2025年11月11日java怎么实现随机验证码图片生成
这篇文章主要介绍"java怎么实现随机验证码图片生成",在日常操作中,相信很多人在java怎么实现随机验证码图片生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java怎么实现随机验证码图片生成"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
具体内容如下
1.controller
/** * 获取随机数验证码图片 * * @param request HttpServletRequest * @param response HttpServletResponse */ @GetMapping(value = "/getRandomCode" ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public void getRandomCode(HttpServletRequest request, HttpServletResponse response) { baseService.getRandomCode(request, response);}2.service
void getRandomCode(HttpServletRequest request, HttpServletResponse response);
3.serviceImpl
@Autowired private RedisTemplate redisTemplate; @Autowired private CodeImageUtils codeImageUtils; /** * 获取随机数验证码图片 */ @Override public void getRandomCode(HttpServletRequest request, HttpServletResponse response) { try { // 设置输出类型为图片 response.setContentType("image/jpeg"); // 生成随机码 String verificationCode = codeImageUtils.getRandomCode(); // 背景颜色与字符颜色 Color color = codeImageUtils.getRandomColor(); Color reverseColor = codeImageUtils.getReverseColor(color); //创建一张彩色的图片 BufferedImage bi = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB); Graphics2D graphics = bi.createGraphics(); //设置字体 graphics.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16)); graphics.setColor(color); //绘制背景 graphics.fillRect(0, 0, 100, 30); graphics.setColor(reverseColor); //绘制字符 graphics.drawString(verificationCode, 18, 20); //绘制最多50个随机噪点//绘制最多50个随机噪点 Random random = new Random(); int n = random.nextInt(50); for (int i = 0; i < n; i++) { graphics.drawRect(100, 30, 1, 1); } // 放到redis中 sessionId:code,过期时间60s redisTemplate.opsForValue().set(request.getSession().getId(),verificationCode,60, TimeUnit.SECONDS); //输出到客户端 ServletOutputStream sos = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos); encoder.encode(bi); sos.flush(); }catch (Exception ex){ log.error("生成验证码失败!",ex); } }4.CodeImageUtils
@Componentpublic class CodeImageUtils { @Autowired RedisTemplate redisTemplate; /** * 生成4位随机的验证码字符串 * * @return */ public String getRandomCode() { // 通过random生成4位随机数字码 Random random = new Random(); StringBuilder rs = new StringBuilder(); for (int i = 0; i < 4; i++) { rs.append(random.nextInt(10)); } return rs.toString(); } /** * 生成随机的颜色 * * @return */ public Color getRandomColor() { Random random = new Random(); return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); } /** * 获取某颜色的反色 * @param color * @return */ public Color getReverseColor(Color color) { return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue()); } /** * 校验 * @param code * @return */ public boolean valid(HttpServletRequest request,String code){ // 获取缓存的code Object cacheCode = redisTemplate.opsForValue().get(request.getSession().getId()); if(cacheCode ==null){ return false; } return code.equals(cacheCode); }}5.请求该接口

6.ImageIO
JPEGCodec这个在高版本的jdk中过期了,替换为ImageIO
//输出到客户端 ServletOutputStream sos = response.getOutputStream(); /*JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos); encoder.encode(bi);*/ ImageIO.write(bi, "PNG", sos); sos.flush();
7.sessionId不一致
以上代码在单节点部署情况下暂时没发现什么问题,但是在多节点部署时会出现sessionId不一致的问题,(别问我怎么知道的…踩坑使我进步)。
解决方案为使用@EnableRedisHttpSession注解来开启session共享。
新增依赖
org.springframework.session spring-session-data-redis 2.1.12.RELEASE
新增配置
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400)
到此,关于"java怎么实现随机验证码图片生成"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
生成
图片
验证
颜色
学习
字符
问题
随机数
输出
客户
客户端
更多
背景
节点
帮助
实用
一致
接下来
上代
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
亚马逊服务器什么意思
韩商言同款as网络安全
手机服务器受限怎么回事
mysql服务器硬件
idear不能连接数据库
数据库更改属性sql
数据库以后可以从事什么岗位工作
p10nas服务器音乐管理
如何避免网络安全隐患的出现
服务器的奇葩队友
intel浪潮服务器
泉州东塔网络安全特训营哪家好
银行管理系统数据库教程
软件开发不会做网线
对数据库感兴趣学习什么
用c 开发上位机软件开发
软件开发技术现状及前景调研
杭州市网络安全新闻
数据库系统阶段结构
我的世界服务器如何获得管理
天津浪潮服务器虚拟化定制服务器
现代信息网络技术转变
武装突袭3架设服务器
恢复gdb文件地理数据库
国信影像云请扫描服务器地址
安阳软件开发招聘信息
vlan在现代组网络技术中
股票缠论软件开发需要多少钱
动态数据库的意思
关于网络安全意识调查报告