SpringBoot实现验证码案例

目录

  • 实现逻辑
  • 前后端交互接口
    • 前端代码
    • 后端代码

实现逻辑

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><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: green;font-size: 2.5em;margin: 0;}p {color: blue;font-size: 1.2em;margin-top: 20px;}</style></head><body><div class="container"><h1>验证成功</h1></div></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 {//注入@Autowiredprivate 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());//设置ContentTyperesponse.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: 50width: 150session:key: CaptchaCodedatetime: CaptchaDate

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

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

相关文章

OpenCV基本操作(python开发)——(7)实现图像校正

OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;1&#xff09; 读取图像、保存图像 OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;2&#xff09;图像色彩操作 OpenCV基本操作&#xff08;python开发&#xff09;——&#xff08;3&…

记录新建wordpress站的实践踩坑:wordpress 上传源码新建站因权限问题导致无法访问、配置新站建站向导以及插件主题上传配置的解决办法

官方文档&#xff1a;How to install WordPress – Advanced Administration Handbook | Developer.WordPress.org 但是没写权限问题&#xff0c;可以下载到 wordpress官方包。 把下载的wordpresscn的包解压并上传到服务器目录下&#xff0c;但是因为是root上传导致了权限问题…

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类&#xff0c;它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状&#xff0c;也可以用于绘制背景等。通过QBrush&#xff0c;可以设置填充的颜色、样式&#xff08;如实心、渐变、纹理等&#xff09…

练习LabVIEW第三十四题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十四题&#xff1a; 在一个波形表中显示三条随机数组成的曲线&#xff0c;分别用红&#xff0c;绿&#xff0c;蓝三种…

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;由一组节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域&#xff08;存储数据&#xff…

【MySQL系列】字符集设置

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

02- 模块化编程-001 ADC采样与显示

周末把单片机的开发环境理顺了,开始模块化编程的实践&#xff0c;先从外围模块开始&#xff0c;先从独立的模块&#xff0c;然后构建复杂一些的综合应用&#xff0c;条件所限&#xff0c;以protues的仿真为主。 1、单片机内置ADC采样与显示电路 2、电路原理简介 该电路主要由…

VScode设置系统界面字体

现象&#xff1a; 系统界面字体太大&#xff0c;导致菜单栏字体显示不全&#xff0c;每次使用都要先点然后才能打开终端和帮助 缩小字体应该就可以实现全部都看到的效果 解决步骤 1. “齿轮形状”设置中心---->设置 2.输入zoom 3.用户—>窗口—>修改“Window: Zoom…

C++初阶——类和对象(上)

目录 1、类的定义 1.1 类定义格式 1.2 访问限定符 1.3 类域 2、类的实例化 2.1 实例化的概念 3、this指针 1、类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。…

小北的字节跳动青训营与LangChain系统安装和快速入门学习(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

卷积神经网络实验三:模型优化(1)

作者有话说&#xff1a; 这篇文章写的还是比混乱的。因为本人也是第一次做这样的尝试&#xff0c;虽然接触深度学习有一年了&#xff0c;但是对于模型的优化仅仅是局限于理论上。通过这一次的实验&#xff0c;我对于模型的理解也更深了几分。我不期望这篇文章能帮你能解决多大问…

信息安全数学基础(42)分式域

一、定义 设R是一个整环&#xff0c;如果有一个域F使得从R到F有一个单的环同态&#xff0c;并且F中的每一个元素都可以表示成σ(a)σ(b)^(-1)的形式&#xff0c;其中a∈R&#xff0c;b∈R*&#xff08;R的非零元构成的乘法群&#xff09;&#xff0c;那么把F称为R的分式域。 二…

HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构

文章目录 什么是 HTML &#xff1f;HTML 的构成 &#xff1f;什么是 HTML 元素&#xff1f;HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML &#xff1f; HTML&#xff08;超文本标记语言&#xff0c;HyperText Markup L…

文本列的性能优化?深入Oracle全文索引

一.什么是全文索引&#xff1f; 全文索引通过分析和处理文本&#xff0c;将文档中的单词分解为词条&#xff08;tokens&#xff09;&#xff0c;然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录&#xff0c;而不必对所有文本逐字匹配。 二…

CentOS7配置静态IP(非解决方法指导,纯笨蛋记录)

一、这篇博客算是记录我终于解决我安装的虚拟机ping不通外网的问题&#xff0c;前前后后我尝试了很多次花了很多时间&#xff0c;最后弄完发现其实都是因为我之前根本不知道什么是虚拟机的网络配置。。。。。 这个链接介绍了vmware虚拟机三种网络模式及配置详解_vmware 特定虚…

数据丢失不用愁!10款必备的数据恢复软件全介绍

现在我们使用微信的频率愈发高涨&#xff0c;不论是生活、工作&#xff0c;甚至是兴趣还好可能都能在这个软件里看到身影。正因为它涉及了我们的生活如果因为病毒或者其他原因导致聊天记录清空&#xff0c;对很多人来说都很麻烦。那么微信聊天记录删了怎样才能恢复呢&#xff0…

国内版Sketchfab平台 - CG美术之家(3D编辑发布篇)

CG美术之家为您提供了一个简便的模型上传流程&#xff0c;让发布您的3D模型变得轻而易举。只需准备好通用的3D模型格式&#xff0c;如OBJ、FBX或STL&#xff0c;您就可以轻松上传并分享您的创作。我们的平台支持在线3D渲染&#xff0c;您只需花费不到一分钟的时间&#xff0c;就…

安防被动红外和主动红外

被动红外探测器是依靠被动的吸收热能动物活动时身体散发出的红外热能进行报警的&#xff0c;也称热释红外探头&#xff0c;其探测器本身是不会发射红外线的。 被动红外探测器中有2个关键性元件&#xff0c;一个是菲涅尔透镜&#xff0c;另一个是热释电传感器。**自然界中任何高…

使用Flask构建RESTful API

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Flask构建RESTful API Flask简介 环境搭建 安装Flask 项目结构 创建应用 路由定义 请求处理 获取查询参数 获取请求体 响应…

知识竞赛活动选手台桌怎么摆放好

知识竞赛活动选手台桌摆放主要根据选手台桌、舞台及和竞赛规则决定&#xff0c;一般有以下几种方案。 一、一字摆放 如果舞台宽度不够&#xff0c;就一字摆放。这样选手就无法看到大屏&#xff0c;选手就要配置看题平板或电脑。也可以在选手前面放置一台大电视。如图&#xf…