SpringBoot-登录验证码实现

SpringBoot实现短信验证码登录 一、要找一个提供短信接口的第三方平台,这里我使用的是榛子云 二、在注册后,就可以使用了 三、首先是在pom.xml中添加依赖 <!-- fastjosn --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> &l... 阅读详情

嗯,工具类记录

原链接:https://blog.youkuaiyun.com/qq_37651267/article/details/99305573,非常感谢原链接博主

此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就可以用。

1.验证码类

 package com.youyou.login.util.validatecode;

import lombok.Data;

/**
 * 验证码类
 */
@Data
public class VerifyCode {

    private String code;

    private byte[] imgBytes;

    private long expireTime;

}

2.验证码生成接口

 package com.youyou.login.util.validatecode;

import java.io.IOException;
import java.io.OutputStream;

/**
 * 验证码生成接口
 */
public interface IVerifyCodeGen {

    /**
     * 生成验证码并返回code,将图片写的os中
     *
     * @param width
     * @param height
     * @param os
     * @return
     * @throws IOException
     */
    String generate(int width, int height, OutputStream os) throws IOException;

    /**
     * 生成验证码对象
     *
     * @param width
     * @param height
     * @return
     * @throws IOException
     */
    VerifyCode generate(int width, int height) throws IOException;
}

3.验证码生成实现类

 package com.youyou.login.util.validatecode;

import com.youyou.util.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

/**
 * 验证码实现类
 */
public class SimpleCharVerifyCodeGenImpl implements IVerifyCodeGen {

    private static final Logger logger = LoggerFactory.getLogger(SimpleCharVerifyCodeGenImpl.class);

    private static final String[] FONT_TYPES = { "\u5b8b\u4f53", "\u65b0\u5b8b\u4f53", "\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66" };

    private static final int VALICATE_CODE_LENGTH = 4;

    /**
     * 设置背景颜色及大小,干扰线
     *
     * @param graphics
     * @param width
     * @param height
     */
    private static void fillBackground(Graphics graphics, int width, int height) {
        // 填充背景
        graphics.setColor(Color.WHITE);
        //设置矩形坐标x y 为0
        graphics.fillRect(0, 0, width, height);

        // 加入干扰线条
        for (int i = 0; i < 8; i++) {
            //设置随机颜色算法参数
            graphics.setColor(RandomUtils.randomColor(40, 150));
            Random random = new Random();
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            graphics.drawLine(x, y, x1, y1);
        }
    }

    /**
     * 生成随机字符
     *
     * @param width
     * @param height
     * @param os
     * @return
     * @throws IOException
     */
    @Override
    public String generate(int width, int height, OutputStream os) throws IOException {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        fillBackground(graphics, width, height);
        String randomStr = RandomUtils.randomString(VALICATE_CODE_LENGTH);
        createCharacter(graphics, randomStr);
        graphics.dispose();
        //设置JPEG格式
        ImageIO.write(image, "JPEG", os);
        return randomStr;
    }

    /**
     * 验证码生成
     *
     * @param width
     * @param height
     * @return
     */
    @Override
    public VerifyCode generate(int width, int height) {
        VerifyCode verifyCode = null;
        try (
                //将流的初始化放到这里就不需要手动关闭流
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ) {
            String code = generate(width, height, baos);
            verifyCode = new VerifyCode();
            verifyCode.setCode(code);
            verifyCode.setImgBytes(baos.toByteArray());
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
            verifyCode = null;
        }
        return verifyCode;
    }

    /**
     * 设置字符颜色大小
     *
     * @param g
     * @param randomStr
     */
    private void createCharacter(Graphics g, String randomStr) {
        char[] charArray = randomStr.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            //设置RGB颜色算法参数
            g.setColor(new Color(50 + RandomUtils.nextInt(100),
                    50 + RandomUtils.nextInt(100), 50 + RandomUtils.nextInt(100)));
            //设置字体大小,类型
            g.setFont(new Font(FONT_TYPES[RandomUtils.nextInt(FONT_TYPES.length)], Font.BOLD, 26));
            //设置x y 坐标
            g.drawString(String.valueOf(charArray[i]), 15 * i + 5, 19 + RandomUtils.nextInt(8));
        }
    }
}

  •  

4.工具类

 package com.youyou.util;

import java.awt.*;
import java.util.Random;

public class RandomUtils extends org.apache.commons.lang3.RandomUtils {

    private static final char[] CODE_SEQ = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
            'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
            'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };

    private static final char[] NUMBER_ARRAY = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

    private static Random random = new Random();

    public static String randomString(int length) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(String.valueOf(CODE_SEQ[random.nextInt(CODE_SEQ.length)]));
        }
        return sb.toString();
    }

    public static String randomNumberString(int length) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            sb.append(String.valueOf(NUMBER_ARRAY[random.nextInt(NUMBER_ARRAY.length)]));
        }
        return sb.toString();
    }

    public static Color randomColor(int fc, int bc) {
        int f = fc;
        int b = bc;
        Random random = new Random();
        if (f > 255) {
            f = 255;
        }
        if (b > 255) {
            b = 255;
        }
        return new Color(f + random.nextInt(b - f), f + random.nextInt(b - f), f + random.nextInt(b - f));
    }

    public static int nextInt(int bound) {
        return random.nextInt(bound);
    }
}

经过以上代码,我们的验证码生成功能基本上已经实现了,现在还需要一个controller来调用它。

     @ApiOperation(value = "验证码")
    @GetMapping("/verifyCode")
    public void verifyCode(HttpServletRequest request, HttpServletResponse response) {
        IVerifyCodeGen iVerifyCodeGen = new SimpleCharVerifyCodeGenImpl();
        try {
            //设置长宽
            VerifyCode verifyCode = iVerifyCodeGen.generate(80, 28);
            String code = verifyCode.getCode();
            LOGGER.info(code);
            //将VerifyCode绑定session
            request.getSession().setAttribute("VerifyCode", code);
            //设置响应头
            response.setHeader("Pragma", "no-cache");
            //设置响应头
            response.setHeader("Cache-Control", "no-cache");
            //在代理服务器端防止缓冲
            response.setDateHeader("Expires", 0);
            //设置响应内容类型
            response.setContentType("image/jpeg");
            response.getOutputStream().write(verifyCode.getImgBytes());
            response.getOutputStream().flush();
        } catch (IOException e) {
            LOGGER.info("", e);
        }
    }

搞定!后台编写到此结束了。那么又会有博友说了:“说好的实现效果呢?”

好吧,那么我们继续前端的代码编写。

前端代码:

 <html>
<body>

<div>
    <input id="code" placeholder="验证码" type="text" class=""
           style="width:170px">
    <!-- 验证码 显示 -->
    <img οnclick="javascript:getvCode()" id="verifyimg" style="margin-left: 20px;"/>
</div>

<script type="text/javascript">
    getvCode();

    /**
     * 获取验证码
     * 将验证码写到login.html页面的id = verifyimg 的地方
     */
    function getvCode() {
        document.getElementById("verifyimg").src = timestamp("http://127.0.0.1:81/verifyCode");
    }
    //为url添加时间戳
     function timestamp(url) {
        var getTimestamp = new Date().getTime();
        if (url.indexOf("?") > -1) {
            url = url + "&timestamp=" + getTimestamp
        } else {
            url = url + "?timestamp=" + getTimestamp
        }
        return url;
    };


</script>
</body>

</html>

可以实现点击图片更换验证码。

实现效果:

当然文章开头的截图是我系统中的截图,需要大家自己去根据自己的情况去开发前端了。

Springboot项目中使用邮箱验证码注册登录的代码实现 本文介绍了在Spring Boot应用中实现邮箱验证码注册和登录功能的完整方案。文章首先概述了三种用户认证方式(邮箱验证码注册/登录和传统密码登录),然后详细说明了实现所需的技术栈(Spring Boot、Spring Security、JWT等)。重点阐述了邮件服务配置、验证码生成与存储的核心实现,包括QQ邮箱授权码获取、Thymeleaf邮件模板处理以及验证码缓存管理。最后展示了发送验证码和用户注册的API实现,为开发者提供了完整的参考方案。该方案兼顾安全性和用户体验,适合现代Web应用的用户认证需求。 阅读详情

相关推荐

Springboot项目中使用手机号短信验证码注册登录实现

本文介绍了在Spring Boot应用中实现短信验证码注册和登录功能的技术方案。采用Spring Boot 3.2.0、互亿无线短信平台、MyBatis Flex和JWT等技术栈,实现了手机号+验证码的注册和登录流程。主要内容包括:短信服务集成配置、短信工具类创建、验证码生成与缓存管理,以及控制层接口实现。通过@Value注解配置短信平台信息,利用Map临时存储验证码(生产环境建议使用Redis),并提供了发送验证码和验证码注册的API接口。该方案简化了移动端认证流程,提升了用户体验,同时保证了安全性。

BXCQ_xuan的技术专栏 | 实战干货·实践教程·学习笔记 1562

springboot验证码

springboot验证码登陆 引入依赖 <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> 生成验证

qq_47032635的博客 405

SpringBoot开发——SpringBoot中4种登录验证码实现方案

SpringBoot开发——4种登录验证码实现方案

bjzhang75的博客 1156

Spring Boot 中 Web开发登录页验证码的简单实现

Controller

学习不是一蹴而就 414

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 391

【AGC】【serverless】【云函数】云函数常见问题

1、云函数添加了AUTH触发器后,在用户执行注册、销户、登录、登出动作时,云函数的event对象会自动触发返回相应信息。比如我在“层”的压缩包里放了config/config.txt,那么我在云函数里怎么调用这个文件?层的目录是:/dcache/layer,函数的目录是/dcache/layer/func。在云函数里往云数据库里插入数据返回的是180000,这是正常吗?已经按照文档在后台对应的云函数里配置了,所需的AUTH触发器。层的用法和放在函数里的用法是相同的。云函数里的层如何调用?

华为开发者联盟 839

【详尽-实战篇】使用Springboot生成自带logo或者图片的二维码-扫描二维码可以跳转到指定的页面-Zing-core

这个项目是一个基于 Java 的二维码生成与解析工具,主要由 QRCodeUtil 和 QRCodeController 两个类组成。它利用了 Google ZXing 库来实现二维码的生成和解析功能,并通过 Spring 框架进行整合,提供了 RESTful API 接口用于生成带有 logo 的二维码。spring:thymeleaf:在静态资源文件resources下的templates里边新建一个html文件,注意需自己建文件夹-- 声明文档类型 -->

海海不掉头发的的博客 1836

Globus数据下载全攻略:从零配置到批量下载大文件(附常见问题解决)

本文详细介绍了Globus数据下载的全流程,从零配置到批量下载大文件的实用技巧,包括环境准备、高级传输策略、性能优化及常见问题解决方案。Globus作为科研数据的高效传输工具,通过并行流传输和自动校验技术,显著提升大规模数据传输的效率和可靠性。

u9v0w的博客 661

springboot生成二维码的正确姿势-附视频附源码

你有没有想过这样一些问题:二维码的原理是什么,如何保证不重复?保证各个平台的二维码是唯一你有没有想过这样一件事,二维码是实现原理是什么?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比如在物流等容易损坏的环境中,如何保证二维码的准确性?

JavaPub 940

PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理

在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。

tianpu2320959696的博客 1023

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2451

SpringBoot学习笔记24——登录验证码实现

今天记录一下验证码的实现,希望能够帮助到大家! 首先我们看一下实现的效果: 此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就可以用。 1.验证码类 package com.youyou.login.util.validatecode; import lombok.Data; /** * 验证码类 */ @Data public class VerifyCod...

月月大王的博客 4312

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

SpringBoot中4种登录验证码实现方案

本文介绍了4种SpringBoot登录验证码实现方案: kaptcha图形验证码 - 通过字符识别防自动化攻击,需配置生成接口并校验Session存储的验证码。 短信验证码 - 结合短信服务商API发送验证码,推荐使用Redis存储并校验5分钟内有效性。 邮箱验证码 - 利用Spring Mail发送邮件验证码,同样依赖Redis进行临时存储与验证。 AJ-Captcha滑动拼图 - 提供无感行为验证,通过starter快速集成,支持Redis存储验证结果。 每种方案均包含依赖配置、核心代码及适用场景,开发

🌱「码路小匠」:以代码为凿,刻出技术的形状 1555

Python电商网站全站爬虫实战:以京东为例的数据采集与分析

随着电子商务的蓬勃发展,电商数据已成为市场研究、竞争分析和消费者行为研究的重要资源。本文详细介绍了如何使用Python最新技术栈构建一个高效的电商网站全站爬虫,以京东为例实现商品数据的自动化采集。文章涵盖了爬虫的法律与伦理考量、技术选型、反爬虫策略应对、分布式架构设计以及数据存储方案,并提供了完整的代码实现。本爬虫系统采用Scrapy-Redis分布式框架、Selenium动态渲染、智能代理轮换和机器学习验证码识别等先进技术,能够稳定高效地抓取京东全站商品数据,为电子商务研究提供数据支持。关键词。

2201_76125261的博客 413

【已解决】飞牛nas(fnOS)异常断电导致硬盘未挂载(无法挂载),系统内部错误修复、救回数据全流程!(含更新系统后外接 NTFS 格式硬盘丢失的修复方法)

fnOS 飞牛NAS遭遇非正常断电后,存储空间显示「未挂载」或更新系统后外接 NTFS 格式硬盘丢失,点击挂载提示「系统内部错误」!💥 博主已经完美恢复,本文记录了相关的解决方案,帮您恢复或最大程度保住重要数据🎉

XiaoqiangClub的博客 2166

SpringBoot + Hutool 实现图片验证码登录

文章目录准备一个登录页面使用 Hutool 工具生成验证码LineCaptcha 线段干扰的验证码CircleCaptcha 圆圈干扰验证码ShearCaptcha 扭曲干扰验证码自定义验证码整合 SpringBoot结合验证码实现登录功能 使用 SpringBoot —— Hutool 实现图片验证码登录其实非常简单,下面就来实现一个简单的登录 demo 准备一个登录页面 这个登录页面的实现非常简单,因为本人不是很会前端,所以登录页面做得还是非常简陋的 编写该页面的时候需要用到 bootstrap 组件,

Woo_home的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SpringBoot项目实现登录验证码验证

本文介绍了在SpringBoot项目中实现登录验证码验证的完整方案。主要内容包括:1)生成验证码图片并存储在Session中;2)创建验证码控制器提供验证码接口;3)修改登录逻辑加入验证码校验;4)前端实现验证码显示与提交。通过验证码工具类生成随机验证码和图片,前端获取并显示验证码,用户登录时先校验验证码正确性,再执行账号密码验证。该方案可以有效防止暴力破解攻击,提升系统安全性。

🌱「码路小匠」:以代码为凿,刻出技术的形状 672

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SpringBoot验证码登录实现

配置返回验证码接口,配置验证码类配置实现类,使用futool工具生成验证码。

weixin_72765762的博客 318

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

vue配合springboot实现验证码操作 用户登录

首先自己导入Vue和jQuery等需要的包,这里我就不放图了。 工具类由于过长我放在文章的最后 在html写入基本请求验证码 <input type="text" name="yzm" placeholder="填写右侧的验证码" data-validate="required:请填写右侧的验证码" v-model="yzm" /> <img src="/in/ge...

坚持去坚持。 3825

spring boot3登录开发-图形验证码接口实现

上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。通过糊涂工具包的图形验证码工具完成获取验证码接口通过redis缓存key(验证码id)-value(验证码内容)

蒾酒的博客 7181

【SpringBoot篇】详解短信验证码登录功能实现

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!(1)产品原型 (2)业务逻辑 (3)接口设计。(1)业务逻辑 (2)接口设计。

fanTuanye的博客 1507

spring boot3登录开发-图形验证码账密登录逻辑实现

上文我们已经实现了图形验证码接口,本文我们实现登录逻辑通过用户登录DTO(数据传输对象)接收用户登录填写信息通过注解@NotNull、@Valid进行参数非空校验通过redis缓存的验证码信息与用户提交的比对验证通过全局异常处理处理参数为空、用户不存在、密码错误、验证码错误、用户被封禁等业务异常说白了就是登录代码可能会判断账号是否存在密码是否正确,当账号不存在或密码错误需要返回对应提示信息,这种类似情况多了你的代码就会很多if-return,代码就会很难看;那么通过自定义异常。

蒾酒的博客 7851

基于springboot实现的验证码登录

1、基于springboot实现的验证码登录功能。 2、redis键值出现 \xac\xed\x00\x05t\x00&的解决方法。 简单提一下文章中使用到的技术: springboot、validation、redis、vue等

時間的博客 1840
上一篇: docker 安装 redis 就是这么简单?
下一篇: Ideaj 安装 leetcode 插件
97牛肉面
博客等级 码龄9年 54粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值