首页 > 其他分享 >SpringBoot实现验证码案例

SpringBoot实现验证码案例

时间:2024-11-02 11:50:38浏览次数:7  
标签:SpringBoot 案例 验证码 private datetime captcha session String

目录

实现逻辑

1、后端功能:随机生成验证码图片,并把交给前端、接收用户输入,验证用户输入的验证码是否正确、

2、前端功能:显示验证码,提供输入框供用户输入他们看到的验证码,把用户输入的数据交给后端,接收后端返回的验证结果

前后端交互接口

后端需要完成的两个工作:1、生成验证码,2、校验验证码的正确性

接口定义:

1、生成验证码

请求url:/captcha/getCaptcha

响应:返回验证码的图片

2、校验验证码的正确性

请求url:/captcha/check

请求参数:用户输入的验证码captcha

响应:验证码正确返回true,错误返回false

前端代码

index.html

展示效果:

用户点击图片之后,可以更新验证码图片

在这里插入图片描述

代码如下:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">
        <title>验证码</title>
        <style>
            body {
                font-family: 'Arial', sans-serif;
                background-color: #f7f7f7;
                margin: 0;
                padding: 0;
                display: flex;
                justify-content: center;
                align-items: center;
                height: 100vh;
            }
            #container {
                text-align: center;
                background: white;
                padding: 50px;
                border-radius: 8px;
                box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
            }
            h1 {
                color: #333;
                font-size: 2em;
                margin-bottom: 20px;
            }
            #inputCaptcha {
                height: 40px;
                margin-right: 10px;
                vertical-align: middle;
                border: 1px solid #ddd;
                border-radius: 4px;
                padding: 0 10px;
            }
            #verificationCodeImg {
                vertical-align: middle;
                border: 1px solid #ddd;
                cursor: pointer;
                transition: transform 0.2s;
            }
            #verificationCodeImg:hover {
                transform: scale(1.05);
            }
            #checkCaptcha {
                height: 40px;
                width: 120px;
                background-color: #5cb85c;
                color: white;
                border: none;
                border-radius: 4px;
                cursor: pointer;
                transition: background-color 0.2s;
            }
            #checkCaptcha:hover {
                background-color: #4cae4c;
            }
        </style>
    </head>

    <body>
        <div id="container">
            <h1>输入验证码</h1>
            <div id="confirm">
                <input type="text" name="inputCaptcha" id="inputCaptcha">
                <img id="verificationCodeImg" src="http://127.0.0.1:8080/captcha/getCaptcha" style="cursor: pointer;"
                     title="看不清?换一张"/>
                <input type="button" value="提交" id="checkCaptcha">
            </div>
        </div>
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
        <script>
            $("#verificationCodeImg").click(function () {
                $(this).hide().attr('src', 'http://127.0.0.1:8080/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();
            });

            $("#checkCaptcha").click(function () {
                $.ajax({
                    type: "post",
                    url: "captcha/check",
                    data: {
                        captcha: $("#inputCaptcha").val()
                    },
                    success: function (result) {
                        if (result) {
                            location.href = "success.html"
                        } else {
                            alert("验证码错误")
                        }
                    }
                });
            });
        </script>
    </body>

</html>

success.html,当用户验证码输入正确时展示的内容

展示效果:

在这里插入图片描述

代码如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>验证成功页</title>
    </head>
    <body>
        <h1>验证成功</h1>
    </body>
</html>

后端代码

结构如下:

在这里插入图片描述

在pom.xml中添加依赖:
在这里插入图片描述

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-captcha</artifactId>
    <version>5.8.26</version>
</dependency>

CaptchaController类:

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

    //注入
    @Autowired
    private CaptchaProperties captchaProperties;

    @Value("${captcha.session.key}")
    private String key;
    @Value("${captcha.session.datetime}")
    private String datetime;


    @RequestMapping("/getCaptcha")
    public void getCaptcha(HttpServletResponse response, HttpSession session) throws IOException {
        //定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(captchaProperties.getWidth(), captchaProperties.getHeight());

        String code = lineCaptcha.getCode();

        //设置session,把验证码信息存储到session中
        session.setAttribute(key, code);
        session.setAttribute(datetime, new Date());


        //验证码写入浏览器
        lineCaptcha.write(response.getOutputStream());

        //设置ContentType
        response.setContentType("image/jpeg");
        //设置编码
        response.setCharacterEncoding("utf8");
        //防止浏览器缓存验证码图片
        response.setHeader("Pragma", "No-cache");

    }

    @RequestMapping("/check")
    public boolean check(String captcha, HttpSession session) {
        String code = (String) session.getAttribute(key);


        if (!StringUtils.hasLength(captcha)) {
            return false;
        }

        //从session中获取时间
        Date date = (Date) session.getAttribute(datetime);

        if (date == null || System.currentTimeMillis() - date.getTime() > 60 * 1000) {
            //session为null,或者session过期(超过一分钟就算过期)
            //System.currentTimeMillis() - date.getTime(): 当前时间-请求时间
            return false;
        }

        //不区分大小写
        return captcha.equalsIgnoreCase(code);
    }
}

CaptchaProperties类:

@ConfigurationProperties(prefix = "captcha")
@Configuration
@Data
public class CaptchaProperties {
    private Integer height;
    private Integer width;

}

MySession类:

@Data
public class MySession {
    private String key;
    private String datetime;
}

配置文件 application.yml:

captcha:
  height: 50
  width: 150
  session:
    key: CaptchaCode
    datetime: CaptchaDate

标签:SpringBoot,案例,验证码,private,datetime,captcha,session,String
From: https://blog.csdn.net/QUIXOTIC_/article/details/143448607

相关文章

  • 113java ssm springboot基于微信小程序的剧本杀游玩一体化平台系统剧本预约(源码+文档+
      文章目录系列文章目录前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试四、代码参考源码获取前言......
  • java基于springboot的项目评审系统(源码+vue+部署文档+前后端分离等)
    收藏关注不迷路!!......
  • Springboot计算机毕业设计古玩交易平台68sgq
    Springboot计算机毕业设计古玩交易平台68sgq本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,古玩类别,古玩展示,商家,古玩拍卖,用户出价,网站公告,展示模块,联系商家开题报告内容一、项目背景......
  • 基于SpringBoot的电视剧推荐系统设计与实现(源码+定制+开发)电视剧推荐系统、个性化影
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • python实操案例——小白篇
    目录案例1:简单计算器详细步骤代码示例说明案例2:判断奇偶数并校验输入详细步骤代码示例说明案例3:计算列表平均值详细步骤代码示例说明案例4:查找最大值和最小值详细步骤代码示例说明案例5:统计字符串中的字符详细步骤代码示例说明案例6:生成斐波那契数列详细步骤......
  • 小龙虾优化算法:原理、与遗传算法区别及应用案例
     一、小龙虾优化算法原理 (一)自然界中的小龙虾行为模拟 小龙虾优化算法(CrayfishOptimizationAlgorithm,COA)是受小龙虾在自然环境中的生存行为启发而提出的。在自然界中,小龙虾有以下几种主要行为: 1. 觅食行为:小龙虾会在其感知范围内搜索食物资源。它们朝着食物浓度......
  • 【开题报告】基于Springboot+vue装修预算系统的设计与实现(程序+源码+论文) 计算机毕业
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着房地产市场的蓬勃发展,装修行业也迎来了前所未有的繁荣。然而,装修过程中的预算管理一直是业主、设计师和施工方共同面临的难题。传统的装修预算方......
  • 【开题报告】基于Springboot+vue制造业企业专件全生命周期管理系统(程序+源码+论文) 计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着制造业的快速发展和市场竞争的日益激烈,企业对生产效率和成本控制的要求越来越高。专件作为制造业企业的重要资产,其全生命周期管理直接关系到企业......
  • springboot在线吉他配套服务系统-计算机毕业设计源码53451
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1数据流程2.2.2业务流程2.3系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4系统用例分析2.5本章小结3系统总体......
  • springboot作业管理系统
      运行环境环境说明:开发语言:java框架:springboot,vueJDK版本:JDK1.8数据库:mysql5.7+(推荐5.7,8.0也可以)数据库工具:Navicat11+开发软件:idea/eclipse(推荐idea)Maven包:Maven3.3.9+系统实现学生管理管理员可以添加,查询,修改,删除学生。下图就是学生管理页面。......