验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot 是如何提供服务的。
1|0SpringBoot 版本
本文基于的 Spring Boot 的版本是 2.6.7 。
2|0 引入依赖
captcha 一款超简单的验证码生成,还挺好玩的。还有中文验证码,动态验证码. 。在项目中 pom.xml 配置文件中添加依赖,如下:
<!--验证码-->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
- 把生成的验证码结果保存到 redis 缓存中,并设置过期时间。
- 前端通过提交验证码和 key,其中 key 就是保存到 redis 中的键,通过这个键获取到对应的值,再与前端提交的值对比,相同就通过验证。
3|1 实现过程
新建验证码枚举类
由于 captcha 这款验证码提供了好几种验证码方法,有中文验证码,动态验证码,算术验证码等等,新建一个验证码每周类存放这几种验证码类型。代码如下:
// fhadmin.cn
public enum LoginCodeEnum {
/**
* 算数
*/
ARITHMETIC,
/**
* 中文
*/
CHINESE,
/**
* 中文闪图
*/
CHINESE_GIF,
/**
* 闪图
*/
GIF,
SPEC
}
该类是定义验证码的基本信息,例如高度、宽度、字体类型、验证码类型等等、并且我们把它转成通过 SpringBoot 配置文件类型来定义更加方便。
// fhadmin.cn
@Data
public class LoginCode {
/**
* 验证码配置
*/
private LoginCodeEnum codeType;
/**
* 验证码有效期 分钟
*/
private Long expiration = 2L;
/**
* 验证码内容长度
*/
private int length = 2;
/**
* 验证码宽度
*/
private int width = 111;
/**
* 验证码高度
*/
private int height = 36;
/**
* 验证码字体
*/
private String fontName;
/**
* 字体大小
*/
private int fontSize = 25;
/**
* 验证码前缀
* @return
*/
private String codeKey;
public LoginCodeEnum getCodeType() {
return codeType;
}
}
把配置文件转换 Pojo 类的统一配置类
// fhadmin.cn
@Configuration
public class ConfigBeanConfiguration {
@Bean
@ConfigurationProperties(prefix = "login")
public LoginProperties loginProperties() {
return new LoginProperties();
}
}
定义逻辑验证生成类
// fhadmin.cn
@Data
public class LoginProperties {
private LoginCode loginCode;
/**
* 获取验证码生产类
* @return
*/
public Captcha getCaptcha(){
if(Objects.isNull(loginCode)){
loginCode = new LoginCode();
if(Objects.isNull(loginCode.getCodeType())){
loginCode.setCodeType(LoginCodeEnum.ARITHMETIC);
}
}
return switchCaptcha(loginCode);
}
/**
* 依据配置信息生产验证码
* @param loginCode
* @return
*/
private Captcha switchCaptcha(LoginCode loginCode){
Captcha captcha = null;
synchronized (this){
switch (loginCode.getCodeType()){
case ARITHMETIC:
captcha = new FixedArithmeticCaptcha(loginCode.getWidth(),loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case CHINESE:
captcha = new ChineseCaptcha(loginCode.getWidth(),loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case CHINESE_GIF:
captcha = new ChineseGifCaptcha(loginCode.getWidth(),loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case GIF:
captcha = new GifCaptcha(loginCode.getWidth(),loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case SPEC:
captcha = new SpecCaptcha(loginCode.getWidth(),loginCode.getHeight());
captcha.setLen(loginCode.getLength());
default:
System.out.println("验证码配置信息错误!正确配置查看 LoginCodeEnum ");
}
}
if(StringUtils.isNotBlank(loginCode.getFontName())){
captcha.setFont(new Font(loginCode.getFontName(),Font.PLAIN,loginCode.getFontSize()));
}
return captcha;
}
static class FixedArithmeticCaptcha extends ArithmeticCaptcha{
public FixedArithmeticCaptcha(int width,int height){
super(width,height);
}
@Override
protected char[] alphas() {
// 生成随机数字和运算符
int n1 = num(1, 10), n2 = num(1, 10);
int opt = num(3);
// 计算结果
int res = new int[]{n1 + n2, n1 - n2, n1 * n2}[opt];
// 转换为字符运算符
char optChar = "+-x".charAt(opt);
this.setArithmeticString(String.format("%s%c%s=?", n1, optChar, n2));
this.chars = String.valueOf(res);
return chars.toCharArray();
}
}
}
控制层定义验证生成接口
// fhadmin.cn
@ApiOperation(value = "获取验证码", notes = "获取验证码")
@GetMapping("/code")
public Object getCode(){
Captcha captcha = loginProperties.getCaptcha();
String uuid = "code-key-"+IdUtil.simpleUUID();
//当验证码类型为 arithmetic时且长度 >= 2 时,captcha.text()的结果有几率为浮点型
String captchaValue = captcha.text();
if(captcha.getCharType()-1 == LoginCodeEnum.ARITHMETIC.ordinal() && captchaValue.contains(".")){
captchaValue = captchaValue.split("\\.")[0];
}
// 保存
redisUtils.set(uuid,captchaValue,loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES);
// 验证码信息
Map<String,Object> imgResult = new HashMap<String,Object>(2){{
put("img",captcha.toBase64());
put("uuid",uuid);
}};
return imgResult;
}
前端调用接口
<template>
<div class="login-code">
<img :src="codeUrl" @click="getCode">
</div>
</template>
<script>
methods: {
getCode() {
getCodeImg().then(res => {
this.codeUrl = res.data.img
this.loginForm.uuid = res.data.uuid
})
},
}
created() {
// 获取验证码
this.getCode()
},
</script>
相关推荐
在现代Web应用开发中,安全性和用户体验是两个非常重要的方面。本教程将介绍如何结合Vue.js前端框架、Spring Boot后端框架、Redis缓存服务以及...这种前后端分离的验证码实现方式在现代Web应用中具有很高的实用价值。
13_智慧校园_业务开发之获得验证码 14_智慧校园_业务开发之登录校验流程分析 15_智慧校园_业务开发之登录验证 16_智慧校园_业务开发之跳转至首页 17_智慧校园_业务开发之业务展示和swagger功能展示 18_智慧校园_业务...
通过学习和分析这些代码,开发者可以深入理解如何利用SpringBoot构建一个完整的前后端分离应用,以及如何设计和实现上述功能模块。此外,还能了解到如何处理用户认证与授权(可能使用Spring Security)、数据库事务...
基于Springboot+VUE 的前后端分离式谷歌验证码生成器后台代码 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信...
1、技术选型: 前端: vue + axios 后端: springboot + mybatis + mysql + tomcat + Redis ...只能当作前后端分离的基础入门项目,因为这里并没有使用组件,只是演示下前后端分离项目的开发过程。
基于Springboot+VUE 前后端分离式谷歌验证码生成器的前端代码全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,...
在前后端分离的架构中,Vue.js作为前端框架与Spring Boot作为后端服务进行交互时,常常会遇到跨域和Session、Cookie失效的问题。本文将详细介绍如何解决这些问题。 首先,跨域是由于浏览器的安全策略限制,同一源...
在技术上,前台采用 Vue渐进式框架,利用VantUI组件库搭建页面,后台使用 SpringBoot框架进行开发,做到了前后端分离。使用JWT实现单点登录,图片和文档上传使用阿里的OSS对象存储,短信功能使用腾讯云的接口,聊天...
项目名称:verify_code_demo 项目描述: 1. springboot为载体的滑动拼图验证码demo 2. 包括后端图片切割和前端滑动效果实现 ...注:前端滑动事件在前后端分离项目中有很多滑动组件,随意使用就可实现!!
本demo实现了简单的登录、注册、获取用户信息三个功能,其中包含密码加密,解决了前后端分离项目常见的跨域问题及session问题,界面清晰简单,后台分层清晰,逻辑清楚。 值得一看。 项目结构:ajax_test为后端项目,...
反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等...
一个前后端分离的用户匹配系统,前端使用Vite + Vue3 + Vant4,后端使用SpringBoot + Mybatis-plus,使用WebSocket实现实时通信,并结合阿里云SDK + 七牛云SDK完成短信发送和图片上传 后端部署 执行安装后端所需依赖...
本课程就是基于外卖业务实现的后端管理系统,基于SpringBoot+Vue技术栈实现, 包含了SpringBoot、Mysbatis、 MySQL、Spring Secutury、 验证码技术、Vue技术等, 课程会讲解整个部署过程,有需要的伙伴可以直接...
这是一个毕业设计项目,主要利用了SpringBoot和MyBatis-Plus框架来构建一个前后端分离的影院选座购票系统。这个系统旨在模拟实际电影院的在线购票流程,为用户提供方便快捷的购票体验。让我们深入探讨一下这个项目...
前后端分离项目,Spring boot作为后端,vue框架实现前端,后端整合swagger3测试工具,jwt实现验证码生成,awt生成图形验证码,整合邮箱验证,使用mybatis-generator自动生成实体类以及mapper,设置有拦截器验证登录...
本集成教程将详细介绍如何在项目中使用aj-captcha库来实现滑块验证码功能,特别适用于基于若依前后端分离架构的应用。 首先,aj-captcha是一个专门用于生成滑块验证码的JavaScript库,它提供了一种动态、直观的方式...
idea实现,技术实现:后端:Spring Boot,前端:JSP,数据库MySQL 功能:用户端:首页,登陆注册,查看宠物信息,评论宠物进行跟贴回帖,成为志愿者,查看宠物救助活动 管理员端:登陆注册+验证码,用户管理,管理员...
Dubbo作为微服务框架实现RPC,负载均衡,请求重试。项目涉及短信验证码解决方案,第三方支付接口快钱 完整示例,Redis缓存解决实际问题,会话跟踪JWT技术。适合从单一架构到分布式架构过渡阶段,熟悉Vue,Spring ...
这个毕业设计项目主要展示了如何利用Java技术栈,包括SpringBoot框架和Vue.js前端框架,以及Java爬虫技术,来构建一个前后端分离的电脑电商资讯网站。以下是对这个项目涉及的关键知识点的详细说明: 1. **...
.zip,基于Spring Boot 2.x的前后端分离开发平台X-Boot 前端:Vue iView Admin 后端:Spring Boot 2.x/Spring Security/JWT/Spring Data JPA Mybatis-Plus/Redis/Elasticsearch/Activiti 分布式限流/同步锁/验证码/...