Java生成图形验证码

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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);
    }
}

生成效果:

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
6月前
|
Java
java实现动态验证码源代码——绘制验证码的jsp
java实现动态验证码源代码——绘制验证码的jsp
|
6月前
|
前端开发 Java
java实现动态验证码源代码——jsp页面
java实现动态验证码源代码——jsp页面
|
1月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
24 1
|
6月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
|
5月前
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
66 1
|
4月前
|
Java 容器
Java详解:GUI图形用户界面设计—容器组件及面板布局方式
Java详解:GUI图形用户界面设计—容器组件及面板布局方式
|
5月前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
100 0
|
5月前
|
前端开发 Java UED
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
|
5月前
|
数据可视化 前端开发 Java
Java中的图形用户界面开发
Java中的图形用户界面开发
|
5月前
|
Java Python
分别使用python和java编写金字塔图形
分别使用python和java编写金字塔图形