Java生成图形验证码

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
函数计算FC,每月15万CU 3个月
简介: Java生成图形验证码
package com.mypro.api.controller;
import com.mypro.api.model.ReturnNode;
import com.mypro.api.util.RedisUtils;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*;
@RestController
@RequestMapping("/api/code")
public class CheckCodeController {
    @Resource
    private RedisUtils redisUtils;
    @ApiOperation("获取图形验证码")
    @PostMapping("/getCodeImg")
    public ReturnNode getCodeImg() throws IOException {
        int width = 100;
        int height = 30;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        Random random = new Random();
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman", Font.PLAIN, 20));
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
        ///画数字
        String randomNum = ((int)(Math.random() * (10000))+1000)+"";
        g.setColor(Color.BLACK); // 设置字体颜色为黑色
        Font font = new Font("Arial", Font.PLAIN, 28); // 创建一个字体对象,设置字体为Arial粗体,大小为60像素
        g.setFont(font); // 将字体设置为指定的字体
        g.drawString(randomNum, 15, 25); // 在图像上绘制数字字符串
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(image, "png", os); // 将BufferedImage转换为PNG格式的字节数组
        byte[] bytes = os.toByteArray(); // 将字节数组转换为byte数组
        String base64Str = Base64.getEncoder().encodeToString(bytes); // 将byte数组转换为Base64编码字符串
        /写入缓存
        String uuidstr = UUID.randomUUID().toString();
        String key = "imgcheckcode_"+uuidstr;
        redisUtils.set(key,randomNum);
        Map<String,String> result = new HashMap<>();
        result.put("base64Str",base64Str);
        result.put("checkImgId",uuidstr);
        return  ReturnNode.ReturnSuccess(result);
    }
    private static Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
}

生成效果:

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
8月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
1345 5
|
10月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
8985 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
12月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
121 1
|
Java 容器
Java详解:GUI图形用户界面设计—容器组件及面板布局方式
Java详解:GUI图形用户界面设计—容器组件及面板布局方式
363 0
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
274 0
|
前端开发 Java UED
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
1175 0
|
数据可视化 前端开发 Java
Java中的图形用户界面开发
Java中的图形用户界面开发
|
Java Python
分别使用python和java编写金字塔图形
分别使用python和java编写金字塔图形
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
232 1
|
Java
JAVA生产随机生成验证码
Java代码实现随机生成指定位数的数字、大小写字母混合的验证码。使用`Random`类生成类型(0-数字,1-大写字母,2-小写字母),然后根据类型转换为相应字符。示例代码展示了一个4位验证码的生成,并附有实现结果图和过程分析。
379 2

热门文章

最新文章