验证码实现

验证码案例

学了Spring MVC ,配置 相关章节, 现可以尝试写一个前后端交互的验证码


文章目录

  • 验证码案例
  • 前言
  • 一、验证码是什么?
  • 二、需求
    • 1.引入依赖
    • 2.导入前端页面
    • 3.约定前后段交互接口
  • 三、代码解析
    • Controller
    • model
    • application.xml
  • 四丶结果
  • 五丶总结


前言

提示:这里可以添加本文要记录的大概内容:

页面如下图所示
1.页面生成验证码
2.输入验证码,点击提交,验证用户输入验证码是否正确,正确则页面跳转

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、验证码是什么?

验证码,是来区分用户是计算机还是人的公共全自动程序,可以防止:恶意破解密码,刷票,等有效防止某个黑客对特定用户进行暴力登录,这个问题必须只有人类才能解答,验证码花样百出,下面我们将采用扭曲干扰验证码来实现前后端交互的接口在这里插入图片描述

二、需求

1.引入依赖

代码如下(示例):

<dependencies>//SpingWeb 框架<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>// lombok 自动生成<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>//test 测试方法<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>//验证码 相关的类 封装好了的 直接用<dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.26</version></dependency></dependencies>

把这段代码加入pom.xml文件中即可,但是要把里面的注释删了 ,否则会出错

2.导入前端页面

代码如下(示例):
index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>验证码</title><style>#inputCaptcha {height: 30px;vertical-align: middle; }#verificationCodeImg{vertical-align: middle; }#checkCaptcha{height: 40px;width: 100px;}</style>
</head><body><h1>输入验证码</h1><div id="confirm"><input type="text" name="inputCaptcha" id="inputCaptcha"><img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?换一张" /><input type="button" value="提交" id="checkCaptcha"></div><script src="https://code.jquery.com/jquery-3.7.1.min.js"></script><script>$("#verificationCodeImg").click(function(){$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({url:"/captcha/check",type:"post",data:{captcha:$("#inputCaptcha").val()},success: function(result){if(result==true){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>

3.约定前后段交互接口

需求分析
后端需要提供两个服务

  1. 生成验证码,并返回验证码;
  2. 校验验证码是否正确;

接口定义
1.生成验证码
请求:

请求URL:/captcha/getCaptcha
响应:验证码图片内容

2.校验验证码是否正确
请求:

请求URL:/captcha/check
请求参数:captcha ,用户传过来的验证码
响应: true / false

三、代码解析

Controller

@RestController
@RequestMapping("/captcha")
public class CaptchaController {//注入配置 对象 , 一些常量从里面读取@Autowiredprivate CaptchaProperties cp;//易凤种 华为msprivate static long VALID_TIME_OUT = 60*1000;@RequestMapping("/getCaptcha")public void getCaptcha(HttpSession session, HttpServletResponse response) {//生成验证码 ,并把验证码写入浏览器中//定义图形验证码的长和宽CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(cp.getWidth(), cp.getHeight(), cp.getCodeCount(), cp.getCilceCount());//打印验证码String code = captcha.getCode();System.out.println(code);//验证码 , 当前时间 存入Sessionsession.setAttribute(cp.getSession().getCode(), code);session.setAttribute(cp.getSession().getDate(), new Date());try {//把验证码写到浏览器中captcha.write(response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e);}}//校验验证码,获取生成的验证码 写给Session@RequestMapping("/check")public boolean check(String captcha,HttpSession session) {//校验是否为空,防止equls空指针if(!StringUtils.hasLength(captcha)){return false;}//从Session中读取值String code = (String) session.getAttribute(cp.getSession().getCode());Date date = (Date) session.getAttribute(cp.getSession().getDate());//校验获取验证码的时间 和 校验时间 的差值不能超过一分钟if(date == null || (System.currentTimeMillis() - date.getTime()) > VALID_TIME_OUT){return false;}return captcha.equalsIgnoreCase(code);}
}

解析 :接口getCaptcha ,用来生成验证码(从hutool上面cv),那么如何将生成的验证码传给另一个接口呢 ? 设置Session,response是用来把验证码写入到文件/浏览器中的 ,前端用来改一下img中图片的src属性即可获取
Controller 从model中获取配置信息, 需要依赖注入 ,各种常量属性,和存储在Session中的“key

model

@Data
@Configuration
@ConfigurationProperties(prefix = "captcha")
//读取配置的信息
public class CaptchaProperties {private Integer width;private Integer height;private Integer codeCount;private Integer cilceCount;private Session session;@Datapublic static class Session {private String code;private String date;}
}

配置对象的接口 ,用来获取配置中的信息(对象) ,并封装成一个类,需要用到@configurationproperties(“prefix="对象名"”)并且设置对象中的属性,内部类 注意使用内部类 一般要加上 public static 或者会出现错误 具体原因后续再说
@Data 是用来生成 get/set 方法的,来自于lombok依赖

application.xml

captcha:width: 100height: 40codeCount: 4circleCount: 40Session:key: SESSION_CAPTCHA_KEYdate: SESSION_CAPTCHA_DATE

配置相关信息,配置了验证码的相关属性,前后端交互时的Session , 使用 key - value 的形式

四丶结果

在这里插入图片描述
点击“提交”,跳转页面 成功!!
在这里插入图片描述

五丶总结

问题:

  • HttpSErvletResponse 是什么 ? 为什么能写入到浏览器 ?
  • 在验证代码时,在一个接口中把验证码传给Session ,另一个接口为什么能从Session中获取到?
  • 在使用内部类时, 为什么 要设置 public ? 为什么 要用static才能运行?
  • [ ]

注意:

  • System.currentTimeMillis() 表示当前时间 ,类型为long , 单位为ms

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

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

相关文章

查询当前用户的购物车和清空购物车

业务需求&#xff1a; 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函数_1.2计算base的exponent次幂

题目&#xff1a; 键盘录入两个整数&#xff1a;底(base)和幂指数(exponent)&#xff0c;计算base的exponent次幂&#xff0c;并打印输出对应的结果。&#xff08;注意底和幂指数都可能是负数&#xff09; 提示&#xff1a;求幂运算时&#xff0c;基础的思路就是先无脑把指数转…

【nacos安装指南】

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

通过发音学英语单词:从音到形的学习方法

&#x1f4cc; 通过发音学英语单词&#xff1a;从音到形的学习方法 英语是一种 表音语言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如汉语拼音、西班牙语等&#xff09;那么规则&#xff0c;而是 部分表音部分表意。这意味着我们可以通…

列表某个字段由多个值组成,使用id匹配展示

说明&#xff1a;列表中字段A的值由多个值组成&#xff0c;但是后端返回的是这多个值的id字符串&#xff0c;需要前端拿着多个id组成的字符串去另一个接口数据源匹配展示 列表后端返回多个字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…

MQL5教程 05 指标开发实战:双色线、双线变色MACD、跨时间周期均线

文章目录 一、双色线指标二、双线变色MACD指标三、跨时间周期均线 一、双色线指标 这里的类型中&#xff0c;Color开头的&#xff0c;是可以选择多个颜色的。 #property indicator_chart_window #property indicator_buffers 18 #property indicator_plots 7 //--- plot xian…

Java全栈面试宝典:线程安全机制与Spring Boot核心原理深度解析

目录 一、Java线程安全核心原理 &#x1f525; 问题1&#xff1a;线程安全的三要素与解决方案 线程安全风险模型 线程安全三要素 synchronized解决方案 &#x1f525; 问题2&#xff1a;synchronized底层实现全解析 对象内存布局 Mark Word结构&#xff08;64位系统&…

【Cursor】设置语言

Ctrl Shift P 搜索 configure display language选择“中文-简体”

【新能源汽车整车动力学模型深度解析:面向MATLAB/Simulink仿真测试工程师的硬核指南】

1. 前言 作为MATLAB/Simulink仿真测试工程师,掌握新能源汽车整车动力学模型的构建方法和实现技巧至关重要。本文将提供一份6000+字的深度技术解析,涵盖从基础理论到Simulink实现的完整流程。内容经过算法优化设计,包含12个核心方程、6大模块实现和3种验证方法,满足SEO流量…

Java 线程池与 Kotlin 协程 高阶学习

以下是Java 线程池与 Kotlin 协程 高阶学习的对比指南&#xff0c;结合具体代码示例&#xff0c;展示两者在异步任务处理中的差异和 Kotlin 的简化优势&#xff1a; 分析&#xff1a; 首先&#xff0c;我们需要回忆Java中线程池的常见用法&#xff0c;比如通过ExecutorService创…

嵌入式EMC设计面试题及参考答案

目录 解释 EMC(电磁兼容性)的定义及其两个核心方面(EMI 和 EMS) 电磁兼容三要素及相互关系 为什么产品必须进行 EMC 设计?列举至少三个实际工程原因 分贝(dB)在 EMC 测试中的作用是什么?为何采用对数单位描述干扰强度? 传导干扰与辐射干扰的本质区别及典型频率范围…

实操(进程状态,R/S/D/T/t/X/Z)Linux

1 R 状态并不直接代表进程在运行&#xff0c;而是该进程在运行队列中进行排队&#xff0c;由操作系统在内存维护的队列 #include <stdio.h> #include <unistd.h>int main() {while(1){printf("我在运行吗\n");sleep(1);}return 0; }查看状态&#xff08…

React 文件上传新玩法:Aliyun OSS 加持的智能上传组件

文件上传是前端开发中的“老朋友”&#xff0c;但如何让它既简单又强大&#xff0c;还能无缝对接云端存储&#xff1f;今天&#xff0c;我要带你认识一个超酷的 React 组件 AliUploader&#xff0c;它不仅支持拖拽上传、批量编辑和文件排序&#xff0c;还直接把文件传到 Aliyun…

LabVIEW多线程

在 LabVIEW 中&#xff0c;多线程编程是提升程序执行效率的关键手段&#xff0c;尤其是在需要并行处理数据采集、控制执行和用户界面交互的场景下。LabVIEW 本身是基于数据流&#xff08;Dataflow&#xff09;的编程语言&#xff0c;天然支持多线程&#xff0c;但要高效利用多线…

图解AUTOSAR_SWS_LINStateManager

AUTOSAR LIN状态管理器(LinSM)详细设计 文档摘要 本文档提供了AUTOSAR LIN状态管理器(LinSM)模块的详细设计解析,包括架构、状态机、睡眠唤醒流程以及配置结构。通过图形化方式展现LinSM在AUTOSAR通信栈中的作用及其与其他模块的交互关系。 目录 AUTOSAR LIN状态管理器(Lin…

python+form+opengl显示动态图形数据

说明&#xff1a; pythonformopengl显示动态图形数据 我希望做一款动态opengl图形数据 1.用python脚本&#xff0c;输入指定参数 2.生成一组数据&#xff0c; 3.将数据保持成本地文件 4.在c#中调用此文件&#xff0c;解析 5.将数据用opengl展示 效果图: step1:添加依赖 C:\U…

Android Gradle、Android Gradle Plugin、BuildTool关系

1. Gradle 的定位&#xff1a;通用构建工具 Gradle 是一个通用的跨平台构建工具&#xff0c;支持多种语言&#xff08;如 Java、Kotlin、C&#xff09;和项目类型 它的核心功能包括&#xff1a; ​任务自动化&#xff1a;通过 Groovy/Kotlin DSL 脚本定义编译、测试、打包等…

DHCP之报文格式

字段说明&#xff1a; op (op code): 表示报文的类型&#xff0c;取值为 1 或 2&#xff0c;含义如下 1:客户端请求报 2:服务器响应报文 Secs (seconds):由客户端填充&#xff0c;表示从客户端开始获得 IP 地址或 IP 地址续借后所使用了的秒数&#xff0c;缺省值为 3600s。 F…

观察者模式在Java微服务间的使用

一.、使用RabbitMQ来实现 (1) 生产者&#xff08;订单微服务&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…

OSPF五种数据包详解

一、OSPF头部封装 OSPF是跨四层封装协议&#xff0c;直接封装在网络层之上&#xff0c;需要IP协议使用一个协议号来标定——89。 OSPF头部结构&#xff1a; 版本&#xff1a;标识OSPF的版本&#xff0c;OSPFv2&#xff08;2&#xff09;、OSPFv3&#xff08;3&#xff09;&am…