登录和注册页面 - 验证码功能的实现

目录

1. 生成验证码

2. 将本地验证码发布成 URL

3. 后端返回验证码的 URL 给前端

4. 前端将用户输入的验证码传给后端

5. 后端验证验证码


1. 生成验证码

使用hutool 工具生成验证码.

1.1 添加 hutool 验证码依赖

<!--  验证码 -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

1.2 创建验证码的控制器 

@RestController
public class CaptchaController {@Value("${imagepath}")private String imagepath; // 验证码的本地路径@RequestMapping("/getcaptcha")public Object getCaptcha1(){// 1.生成验证码到本地//定义图形验证码的长和宽 (这个验证码的大小需要和自己前端的验证码的大小匹配)LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(128, 50);String uuid = UUID.randomUUID().toString().replace("-","");// 图形验证码写出,可以写出到文件,也可以写出到流lineCaptcha.write(imagepath + uuid + ".png");return AjaxResult.success(imagepath+uuid+".png");}
}

application.propertities 中添加验证码保存路径 (末尾一定要带斜杆)

# 验证码保存路径
imagepath=D:/image/

【注意】

  • 如果项目中配置了拦截器, 那么一定要记得再拦截规则中给验证码的路由放行!!
  • 使用 UUID 每次生成不同地址的验证码

 1.3 前端关键代码

<div class="row" style="margin-bottom: 20px;"><span>验证码</span><input id="checkCode" style="width: 66px;">&nbsp;&nbsp;<img onclick="loadCode()" id="codeimg" src=""style="height: 50px;width: 128px;">
</div>

浏览器直接访问接口 : 127.0.0.1:8080/getcaptcha 

再查看本地路径也确实生成了对应的验证码 : 

 

2. 将本地验证码发布成 URL

2.1 配置映射图片路径

@Configuration
public class AppConfig implements WebMvcConfigurer {@Value("${imagepath}")private String imagepath;/*** 映射图片路径* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/image/**").addResourceLocations("file:" + imagepath + "/");}
}

使用网络路径 /image/** 映射到本地验证码路径, 注意 "file:" + imagepath + "/"  这最后可能要加上一个斜杆才能生效. (因人而异)

2.2 使用映射后的网络路径访问验证码

浏览器输入: 127.0.0.1:8080/image/b1306474838b4b0e9f8a6ac7606567cb.png

成功访问到了!!

3. 后端返回验证码的 URL 给前端

后端不仅要返回验证码给前端, 还需要返回一个 "验证码的 key" 给前端.

后端返回验证码的 URL 给前端可以理解, 前端需要展示给用户看; 

那么验证码的 key 是啥呢 ???

后端需要将验证码存储 redis, 因为验证码在某一时间内可以生成很多, 而用户输入的正确与否, 需要在后端进行判断, 后端进行判断时, 就得把生成的验证码存储 redis (快), 而存储 redis 我们可以借着前面的 UUID , 把 UUID 作为 key, 验证码作为 value 去存储. 然后再将 key 去传给前端, 前端就可以带着输入的验证码和 key 一起传给后端, 后端就可以拿着 key 去查 redis 得到一个验证码, 然后与前端传过来的作比较即可.

3.1 完善后端 CaptchaController.java 代码

@RestController
public class CaptchaController {@Value("${imagepath}")private String imagepath; // 验证码的本地路径@Resourceprivate RedisTemplate redisTemplate; // 将存储验证码的 key - uuid@RequestMapping("/getcaptcha")public Object getCaptcha(){// 1.生成验证码到本地//定义图形验证码的长和宽 (这个验证码的大小需要和自己前端的验证码的大小匹配)LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(128, 50);String uuid = UUID.randomUUID().toString().replace("-","");// 图形验证码写出,可以写出到文件,也可以写出到流lineCaptcha.write(imagepath+uuid+".png");// 验证码的网络地址String url = "/image/"+uuid+".png";// 将验证码存储到 redisredisTemplate.opsForValue().set(uuid,lineCaptcha.getCode());HashMap<String,String> result = new HashMap<>();result.put("codeurl",url);result.put("codekey",uuid);return AjaxResult.success(result);}
}

4. 前端将用户输入的验证码传给后端

4.1 前端加载验证码

<script>// 验证码keyvar codeKey = "";// 获取并显示验证码function loadCode() {jQuery.ajax({url: "/getcaptcha",type: "GET",data: {},success: function (res) {if (res.code = 200 && res.data != null && res.data != "") {// 获取验证码成功codeKey = res.data.codekey;jQuery("#codeimg").attr("src", res.data.codeurl);}}});}loadCode();
</script>

效果图  

 4.2 前端将验证码和 key 传给后端

jQuery.ajax({url:"/user/reg",type:"post",data:{username:username.val(),password:password.val(),checkCode:checkCode.val(),codeKey:codeKey},success:function(body) {if(body.code==200 && body.data!=null) {alert("恭喜,注册成功!");if(confirm("是否要去登录页面 ?")) {location.href = "login.html";}} else if(body.code == -1) {alert("抱歉, 注册失败, 请重新注册! " + body.msg);} else {alert("该用户名已被使用, 请重新输入!");}}
});

5. 后端验证验证码

5.1 注册功能中验证验证码

@RequestMapping("/reg")
public Object reg(UserInfoVo userInfoVo) {// 1. 非空效验// 省去具体代码....// 2.检查验证码是否正确String redisCodeValue = (String) redisTemplate.opsForValue().get(userInfoVo.getCodeKey());if(!StringUtils.hasLength(redisCodeValue) ||!redisCodeValue.equals(userInfoVo.getCheckCode())) {// 验证码不正确return AjaxResult.fail(-1, "验证码错误!");}// .....// .... 其他业务逻辑return AjaxResult.success(result);
}

登录功能的后端验证验证码其实是一样的方法, 照猫画虎即可~


此处的验证码功能是针对之前的博客 - SSM - 博客系统 来做的一个扩展功能, 有兴趣的可以去实现一下~~

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

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

相关文章

topthink/think-captcha 3.* thinkphp6 验证码前后端分离Api登录

在我写 TP5 前后端分离验证码之后不久&#xff0c; 要在TP6上去搞。原来以为有前车之鉴了&#xff0c; 我在tp6搞会很轻松&#xff0c; 没想到他的包更新了 3 版本了。 在我一些列阅读源码之后&#xff0c;我的同事提醒我&#xff0c; 这个Tp 在中国已经很成熟了啊&#xff0c…

登录功能图片验证码的实现

首先从网上下载一个生成验证码的Servlet&#xff1a; package com.train.controller;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.BufferedReader; import ja…

带验证码的登录页面

带验证码的登录页面 HTML页面中用表单标签的post方式提交到相应的php后台文件 <html lang"en"> <head><meta charset"UTF-8"><title>登录页面</title> </head> <body> <form method"post" actio…

GPT之父谈未来五年的AI:模型规模见顶,下个突破点在用好AI涌现特质

夕小瑶科技说 分享来源 | Web3 天空之城作者| 城主 划重点 ①尽管 AI 模型性能惊人&#xff0c;但它们的学习能力仍远远落后于人类。它们需要大量数据来学习&#xff0c;而人类可以从很少的数据中学习很多。所以&#xff0c;要达到人类的学习速度&#xff0c;这些模型还需要做大…

超好用万能提示词框架,ChatGPT效率翻三倍!

前几天写了几篇自己的AI实践&#xff1a; 《程序员&#xff0c;如何借力ChatGPT&#xff1f;》 《普通人&#xff0c;如何借力ChatGPT&#xff1f;》 《我认为&#xff0c;最好用的AI工具是它》 《如何借力AI工具做PPT》 很多朋友在后台留言&#xff0c;问我应该如何写高质量的…

Html5浪漫结婚请柬婚礼网站模板❤_爱她就给她最美的H5婚礼请柬_(婚庆电子邀请函)含背景音乐...

❉ Html5浪漫结婚请柬婚礼网站模板❤_爱她就给她最美的H5婚礼请柬_(婚庆电子邀请函)含背景音乐 一年一度的/520情人节/七夕情人节/生日礼物/告白师妹/程序员表白,这个是一个简单得html得结婚请柬效果图&#xff0c;是动态得&#xff0c;上面得文字可以更改&#xff0c;图片都可…

微信小程序电子签名及图片生成

基于微信小程序的电子签名及图片生成 前言:随着无纸化的推广,线上办公流程逐渐大众化,在线签字、等功能极大的缩短了异地签署周期,减少项目成本。 目录 一、功能介绍1.1、简介1.2、使用领域及原则1.3、相关技术1.4、小程序效果图1.5、基本功能二、代码块2.1、view2.2、wxss…

谁说程序员不懂浪漫——我的C语言结婚请柬(附源码)

前言&#xff1a;但行好事&#xff0c;莫问前程——《增广贤文》 从上学起开始学C,后面也做过H5&#xff0c;现在做Android。无论是学习用的&#xff0c;还是工作用的&#xff0c;上百个软件不止。但最另我骄傲的是&#xff0c;我用程序烂漫了一把。 用C语言&#xff0c;利用W…

计算机制作请柬,婚礼纪能用电脑制作电子请柬吗?电子请柬有哪些注意事项?...

不知道大家有没有发现&#xff0c;不知道从什么时候开始&#xff0c;结婚请柬已经从传统的纸质请柬变成了电子请柬的形式&#xff0c;这种不花成本去买、不费时间去派发的方式也是得到了越来越多新人的追捧。当然&#xff0c;纸质请柬有纸质请柬的制作方法&#xff0c;电子请柬…

HTML5结婚请柬响应式婚礼网站模板

简介&#xff1a; HTML5结婚请柬响应式婚礼网站模板是一款大气浪漫的结婚婚纱网站模板下载。aspku提示&#xff1a;本模板调用到谷歌字体库&#xff0c;可能会出现页面打开比较缓慢。 下载地址&#xff1a; http://www.bytepan.com/QwOAHHQ2pep

婚礼邀请函微信小程序

7.2.1任务分析 一、任务功能分析 本项目是一个婚礼邀请函小程序&#xff0c;通过小程序向亲朋好友发送婚礼到场邀请&#xff0c;相对于传 统方式的请柬&#xff0c;给人们带来不一样的便捷体验&#xff0c;也更容易受到广大年轻群体的喜爱。通过电 子版的邀请函&#xff0c;邀请…

婚礼请帖_第一次在线婚礼发生在1876年

婚礼请帖 重点(Top highlight) As the Covid-19 pandemic wears on, more and more of life has moved online — school, playdates, conferences, civic events, court proceedings, and even weddings. According to Wired, more than 450,000 couples were married between…

婚礼邀请函首页

一、 首页分析 1.1 邀请函页面的需求 背景音乐播放&#xff1a;页面的右上角有一个背景音乐播放按钮&#xff0c;用于控制音乐播放状态&#xff0c;单击按钮播放音乐&#xff0c;再次单击按钮暂停音乐。新人信息&#xff1a;页面中展示新娘和新郎的头像、姓名信息。婚礼信息&…

婚礼邀请函页面实现

邀请函实现步骤 主体页面以及导航栏样式布置一、项目初始化1、导航栏及标签部分代码 二、页面结构和样式1.邀请函页面主体页面包含了头顶部分的GIF图&#xff0c;标题&#xff0c;头像&#xff0c;及地点的等部分首页代码我们将在index.wxml文件中实现&#xff1a;首先&#xf…

微信小程序-婚礼邀请函页面

微信小程序-婚礼邀请函页面 &#xff08;1&#xff09;pages文件中的文件创建&#xff1a; 1.在app.json中进行创建文件&#xff0c;保存即可在pages中生成文件&#xff1b; &#xff08;2&#xff09;完成下导航&#xff1a; 1.在app.json中新增tabBar方法&#xff0c;并t在ab…

婚礼邀请函小程序项目

文章目录 一、学习目标1.掌握小程序常用组件的使用2.掌握腾讯视频插件的使用3.掌握背景音乐API、地图API的使用4.掌握订阅消息的发送 二、开发前准备1.项目展示 三、代码实现1 项目搭建2 功能实现2.1 背景音乐功能2.2 照片页面功能2.3 美好时光页面2.4 婚礼地点页面2.5 宾客信息…

微信小程序 - 婚礼邀请函

marry 微信小程序端 服务端 扫码体验 免费制作流程点我查看 主页面展示 项目说明 服务端架构&#xff1a;SpringMvc 服务器&#xff1a;阿里云服务 域名&#xff1a;pengmaster.com 数据库&#xff1a;在服务器上装的mysql 地址&#xff1a;47.104.198.222:3306 后台地址&am…

html5怎么做电子请帖,如何制作H5婚礼邀请函?

H5是HTML5的简称。HTML5是HTML最新的修订版本&#xff0c;是一种超文本标记语言。H5有两大特点&#xff1a;首先&#xff0c;强化了 Web 网页的表现性能。其次&#xff0c;追加了本地数据库等 Web 应用的功能。 H5页面就是利用html5制作出来的页面&#xff0c;尤其在微信中发展…

一生一世一双人!爱她就给她最美的H5婚礼请柬~

结婚在传统观念中是一生一次的大事情&#xff0c;婚礼请柬就是其中之一。现在&#xff0c;电子请柬大行其道&#xff0c;艺术性的排版&#xff0c;配上出彩的动画和音乐&#xff0c;可以永久完整保存的特性让电子请柬倍受欢迎。今天主页妞给大家收集了一些唯美的H5婚礼请柬&…

动态婚礼请帖PPT模板

模板介绍 一份高质量的PPT模板&#xff0c;可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会&#xff0c;今天小编分享一份精美的动态婚礼请帖PPT模板 PPT模板名称&#xff1a;动态婚礼请帖PPT模板&#xff0c;模板编号&#xff1a;P27732&#xff0c;大小10MB&…