Java生成图形验证码

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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);
    }
}

生成效果:

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
2月前
|
Java
java实现动态验证码源代码——绘制验证码的jsp
java实现动态验证码源代码——绘制验证码的jsp
13 0
|
2月前
|
前端开发 Java
java实现动态验证码源代码——jsp页面
java实现动态验证码源代码——jsp页面
13 0
|
2月前
|
Java 机器人 网络安全
Java代码快速生成验证码
Java代码快速生成验证码
35 0
|
2月前
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
24 2
|
2月前
|
数据采集 JavaScript 前端开发
使用Java解决快手滑块验证码
使用Java解决快手滑块验证码
|
4月前
|
JavaScript 小程序 Java
基于Java的养老院管理系统的设计与实现(亮点:多角色、登录验证码、留言反馈)
基于Java的养老院管理系统的设计与实现(亮点:多角色、登录验证码、留言反馈)
24 0
|
4月前
|
数据采集 安全 前端开发
Java制作数字加减法验证码
Java制作数字加减法验证码
38 0
|
4月前
|
数据采集 安全 前端开发
Java如何制作图片输入验证码
Java如何制作图片输入验证码
13 0
|
5月前
|
缓存 算法 Java
Java【算法 05】通过时间获取8位验证码(每两个小时生成一个)源码分享
Java【算法 05】通过时间获取8位验证码(每两个小时生成一个)源码分享
35 0
|
Java
Java Web(四) 一次性验证码的代码实现
其实实现代码的逻辑非常简单,真的超级超级简单。
94 0