获得 随机验证码(以图片为底层)

news2024/11/19 17:26:25

1:工具类

@Slf4j
public class RandomValidateCode {


    private static String baseNumLetter = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
    private static String font = "微软雅黑";

    //绘制验证码图片,返回验证码文本内容
    public static String drawRandomText(int width, int height, BufferedImage verifyImg) {

        Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();
        graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
        graphics.fillRect(0, 0, width, height);//填充背景
        graphics.setFont(new Font(font, Font.BOLD, 30));

        StringBuffer sBuffer = new StringBuffer();
        int x = 10;  //旋转原点的 x 坐标
        String ch = "";
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            graphics.setColor(getRandomColor());
            //设置字体旋转角度
            int degree = random.nextInt() % 30;  //角度小于30度
            int dot = random.nextInt(baseNumLetter.length());
            ch = baseNumLetter.charAt(dot) +"";
            sBuffer.append(ch);
            //正向旋转
            graphics.rotate(degree * Math.PI / 180, x, 45);
            graphics.drawString(ch, x, 45);
            //反向旋转
            graphics.rotate(-degree * Math.PI / 180, x, 45);
            x += 48;
        }

        //画干扰线
        /*for (int i = 0; i < 30; i++) {
            // 设置随机颜色
            graphics.setColor(getRandomColor());
            // 随机画线
            graphics.drawLine(random.nextInt(width), random.nextInt(height),
                    random.nextInt(width), random.nextInt(height));

        }

        //添加噪点
        for (int i = 0; i < 200; i++) {
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            graphics.setColor(getRandomColor());
            graphics.fillRect(x1, y1, 2, 2);

        }*/
        log.info("======图文验证:{}", sBuffer.toString());
        return sBuffer.toString();
    }

    //获取随机颜色

    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256),
                ran.nextInt(256), ran.nextInt(256));
        return color;
    }

2:方法层

String getCheckCode(String phone, BufferedImage verifyImg);

3:业务层

@Override
public String getCheckCode(String phone, BufferedImage verifyImg) {
    String randomText = RandomValidateCode.drawRandomText(BaseUtils.TWO_HUNDRED, BaseUtils.SIXTY, verifyImg);
    log.info("RandomValidateCode randomText:{} ", randomText);
    this.stringRedisTemplateOne.opsForValue().set(BaseUtils.KEY_IMAGE + phone, randomText, BaseUtils.CODE_TIME, BaseUtils.TIME_UNIT);
    return randomText;
}

4:控制层

@PostMapping("/getCheckCode")
public void getCheckCode(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "phone") String phone) {
    try {
        BufferedImage verifyImg = new BufferedImage(BaseUtils.TWO_HUNDRED, BaseUtils.SIXTY, BufferedImage.TYPE_INT_RGB);
        request.getSession().setAttribute("verifyCode", userService.getCheckCode(phone, verifyImg));
        response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别
        OutputStream os = response.getOutputStream(); //获取文件输出流
        ImageIO.write(verifyImg, "png", os);//输出图片流
        os.flush();
        os.close();//关闭流
    } catch (IOException e) {

    }
}

5:页面效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】pytorch安装——环境配置(极简教程)

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 省流总结新建环境确定显卡型号安装显卡驱动安装pytorch国内镜像下载本地下载 验证安装成功 最近重新配置环境&#xff0c;简单记录一下。最近chatgpt等大语言模型和ai绘图火热&#xff0c;也为了方便很多…

视频剪辑必备的6个免费素材网站

做视频剪辑需要用到视频、音频、图片等素材&#xff0c;推荐几个网站&#xff0c;有免费、有付费&#xff0c;可根据需求自信选择~赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种…

电视机顶盒哪个牌子好?数码小编盘点电视机顶盒排行榜

电视机顶盒哪个牌子好&#xff1f;这是困扰新手们的一大难题&#xff0c;部分产品被爆出虚标高配、偷工减料&#xff0c;面对众多的机顶盒品牌和型号&#xff0c;怎么选择才好&#xff1f;小编以销量和用户评价为标准&#xff0c;盘点了电视机顶盒排行榜&#xff0c;跟着我一起…

Web端3D轻量化引擎基于PBR渲染——仿真模拟更逼真

HOOPS Communicator在2021版本中&#xff0c;推出了基于PBR&#xff08;Physically Based Rendering&#xff09;的渲染特性以提供更高质量的渲染技术。 PBR将材料表示为一系列方程&#xff0c;这些方程对光如何从表面反射进行建模&#xff0c;再通过GPU上运行的着色器代码进行…

MySQL基础(二)MySQL环境搭建

. MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现在“正在运行”状态&…

linux:命令grep查找关键字、wc统计以及管道符

linux:命令grep查找关键字、wc统计以及管道符 grep: wc: 输入wc test.txt时&#xff0c;输出了2 11 59 这三个数字 意思是:2行、11个单词(用空格分开就算一个单词)、59个字符(字节) ls -l看了看&#xff0c;也确实是59个字节。 通过wc的可选项来进行查看&#xff1a; 管道符…

成功解决:ubuntu下ifconfig不显示网卡信息

目录 前言方法一&#xff08;临时&#xff09;方法二第一步第二步第三步 前言 好久没动电脑虚拟机&#xff0c;今天打开ubuntu发现右上角没有网络图标&#xff0c;打开终端ping不同百度&#xff0c;再输入ifconfig发现不显示网卡信息&#xff0c;于是开始尝试各种方式&#xf…

11.软考——必考题型

1.必考题一------网络图 (1)完成项目的最少时间,肯定要最大最长的活动完成才算完成项目,因此找最长的路径:A->B->D->G->I->K->L 22天 (2)由于BD这条线就是处于最长的线,因此不能晚开始,晚开始就会导致整个项目都跟着晚。 (1)最长18 A--B…

Mysql 学习(八)单表查询方法二

复杂查询 上一节说了5种访问类型的查询&#xff0c;这一节就来说说关于这些比较复杂的查询 情况一&#xff1a;多个二级索引查询 sql&#xff1a;SELECT * FROM index_value_table WHERE value1 abc AND value2 > 1000;搜索条件&#xff1a; value1 等于 abcvalue2 大于…

tensorRT的完整安装以及常见错误 export failure: [WinError 127] 找不到指定的程序。

安装CUDA 查看本机适配的CUDA 版本 要想安装TensorRT必须要先安装CUDA和cudnn&#xff0c;那么首先需要去查看自己电脑的英伟达驱动程序程序&#xff0c;位置如下&#xff1a; NVIDIA控制面板->帮助->系统信息->组件&#xff0c;如下图所示本机适配CUDA版本为11.7 …

mongodb分片集群搭建

1.本次搭建使用三台centos7主机搭建伪集群&#xff0c;关闭防火墙和selinux服务 2.mongodb架构相当于9个分片节点&#xff0c;3个路由节点&#xff0c;3个配置节点&#xff0c;主机信息如下图所示 主机名称主机ip地址端口服务A10.1.60.11420001&#xff0c;21001&#xff0c;…

二叉树基本概念、种类、存储方式、遍历(JS实现)

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 二叉树基本概念性质 二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜…

问卷调查工具排行榜

问卷调查是从特定目标受众收集信息、意见和反馈的重要工具。随着技术的进步&#xff0c;市场上有许多问卷调查工具可供选择&#xff0c;这使得选择最适合您需求的工具变得具有挑战性。在本文中&#xff0c;我们将讨论一些可用的知名问卷调查工具。 1、Zoho Survey Zoho Surve…

看过这篇文章,读懂数据分析

一、为什么需要数据分析 数据分析的重要性不言而喻&#xff0c;没有数据&#xff0c;就是感性。数据不会被观点打败&#xff0c;数据只能被数据打败。我们现在妥妥地已经进入了数据时代。 量化IT投资成效&#xff0c;以数据驱动决策 站在公司或者决策者角度&#xff0c;数据最…

Smart Tools 网站的架构之美

本文将简要介绍Smart Tools工具箱网站的架构设计&#xff0c;带领大家一起领略架构之美。 Smart Tools是一款实用的在线工具箱网站&#xff0c;地址&#xff1a;https://smart-tools.cn 总体架构 Smart Tools工具箱网站是采用前后端分离的总体架构。其中&#xff0c;前端是由…

纯干货建议码住,新手写软文有哪些注意事项

随着互联网发展的越来越好&#xff0c;越来越的企业开始注重网络营销&#xff0c;软文营销就是其中的一种。软文营销对于很多企业来说无疑是非常具有优势的一种宣传方式。它可以帮助公司更优秀的传达其产品及服务的诉求&#xff0c;吸引潜在客户&#xff0c;加强品牌知名度&…

Java 电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

一文解析Multi-queue 架构

Linux上传统的块设备层&#xff08;Block Layer&#xff09;和IO调度器&#xff08;如cfq&#xff09;主要是针对HDD&#xff08;hard disk drivers&#xff09;设计的。我们知道&#xff0c;HDD设备的随机IO性能很差&#xff0c;吞吐量大约是几百IOPS&#xff08;IOs per seco…

魔兽世界服务端AzerothCore核心Centos系统编译教程

魔兽世界服务端AzerothCore核心Centos系统编译教程 大家好,我是艾西今天跟大家分享下用linux系统怎么编译一个自己的魔兽世界服务端 准备工作:服务器一台、 安装软件、下载源码、 地图文件、 修改配置文件 修改文件执行权限、 修改配置文件、编译及启动、编译项目 数据…

体验 langchain-ChatGLM

体验 langchain-ChatGLM 1. 什么是 langchain-ChatGLM2. 什么是 langchain3. Github 地址4. 安装 Miniconda35. 创建虚拟环境6. 部署 langchain-ChatGLM7. 启动 langchain-ChatGLM8. 访问 langchain-ChatGLM9. API部署10. 命令行部署11. 其他&#xff0c;LangChain Document Lo…