网站首页 > 精选教程 正文
滑动验证码操作是现在系统校验一种常用的方式,在SpringBoot中实现滑动验证码操作,首先需要创建背景图和滑动图两个图片,然后标记滑动块在背景图上的位置,通过前后端的交互来实现滑动验证码的验证操作。下面我们就来详细看看如何实现一个简单的滑动验证码操作。
生成验证码图片和滑块
在SpringBoot中,我们可以使用Java的图形处理库来生成对应的背景图和滑动图片,这里我们演示了通过java.awt库来生成背景图片和滑块,如下所示。
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController
public class CaptchaController {
private static final int WIDTH = 300;
private static final int HEIGHT = 150;
private static final int SLIDER_WIDTH = 50;
private static final int SLIDER_HEIGHT = 50;
@GetMapping("/captcha")
@ResponseBody
public CaptchaResponse getCaptcha() throws IOException {
BufferedImage bgImage = createBackgroundImage();
Point sliderPoint = createSliderImage(bgImage);
ByteArrayOutputStream bgOutputStream = new ByteArrayOutputStream();
ImageIO.write(bgImage, "png", bgOutputStream);
String bgImageBase64 = Base64.getEncoder().encodeToString(bgOutputStream.toByteArray());
return new CaptchaResponse(bgImageBase64, sliderPoint.x);
}
private BufferedImage createBackgroundImage() {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.dispose();
return image;
}
private Point createSliderImage(BufferedImage bgImage) {
Graphics2D g = bgImage.createGraphics();
g.setColor(Color.WHITE);
Random random = new Random();
int x = random.nextInt(WIDTH - SLIDER_WIDTH);
int y = random.nextInt(HEIGHT - SLIDER_HEIGHT);
g.fillRect(x, y, SLIDER_WIDTH, SLIDER_HEIGHT);
g.dispose();
return new Point(x, y);
}
static class CaptchaResponse {
public String bgImage;
public int sliderX;
public CaptchaResponse(String bgImage, int sliderX) {
this.bgImage = bgImage;
this.sliderX = sliderX;
}
}
}
前端展示和交互
使用HTML和JavaScript来展示滑动验证码,并让用户滑动滑块,来进行滑动块的验证操作。下面的例子中,我们通过JavaScript的验证来实现直接的验证操作,当然我们也可以实现后端验证。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Captcha</title>
<style>
.captcha-container {
position: relative;
width: 300px;
height: 150px;
border: 1px solid #ccc;
}
.slider {
position: absolute;
width: 50px;
height: 50px;
background-color: #fff;
cursor: pointer;
}
</style>
</head>
<body>
<div class="captcha-container">
<img id="bgImage" src="" alt="Captcha Background">
<div class="slider" id="slider"></div>
</div>
<script>
let slider = document.getElementById('slider');
let container = document.querySelector('.captcha-container');
let bgImage = document.getElementById('bgImage');
fetch('/captcha')
.then(response => response.json())
.then(data => {
bgImage.src = 'data:image/png;base64,' + data.bgImage;
slider.dataset.correctX = data.sliderX;
});
let startX, isDragging = false;
slider.addEventListener('mousedown', function(event) {
startX = event.clientX;
isDragging = true;
});
document.addEventListener('mousemove', function(event) {
if (isDragging) {
let moveX = event.clientX - startX;
if (moveX >= 0 && moveX <= container.clientWidth - slider.clientWidth) {
slider.style.left = moveX + 'px';
}
}
});
document.addEventListener('mouseup', function(event) {
if (isDragging) {
isDragging = false;
let correctX = parseInt(slider.dataset.correctX);
let currentX = parseInt(slider.style.left || 0);
if (Math.abs(correctX - currentX) < 5) {
alert('Captcha passed');
} else {
alert('Captcha failed');
}
slider.style.left = '0px';
}
});
</script>
</body>
</html>
后端验证
在滑块移动完成之后,我们将滑块的位置发送到后端进行位置认证操作,在上面的例子中,我们是通过JavaScript来进行的直接验证,当然也可以通过后端验证,就是将相关的参数记录到后端缓存中,当前端调用将相关的参数传到后端之后,通过后端的校验逻辑来实现验证码的校验,当然在一般情况下对于防刷操作的验证码操作可以在前端进行验证,毕竟就是为了防刷验证,如果对于需要校验的验证码则是需要传入到后端进行校验
总结
这种方式只是一个简单的滑动验证操作实现,在实际项目中需要一些更加复杂的功能来实现操作,例如动态生成复杂的图形验证、或者使用缓存保存验证码的操作等等来引入相关的安全操作。
猜你喜欢
- 2024-11-11 RuoYi若依系统的验证码如何替换为更美观的EasyCaptcha
- 2024-11-11 「Java」伪共享验证 什么是伪共享?伪共享会导致运算结果错误吗?
- 2024-11-11 Azure上的Java:云原生身份验证 azure java
- 2024-11-11 Java之HTTP请求权限验证 java之http请求权限验证怎么办
- 2024-11-11 java短信验证平台_JAVA实现利用第三方平台发送短信验证码
- 2024-11-11 OAuth2+JWT 实现权限验证 oauth2权限控制
- 2024-11-11 Java 的业务逻辑验证框架 之-fluent-validator
- 2024-11-11 java 生成4位短信验证码方法 java+生成4位短信验证码方法有哪些
- 2024-11-11 Java策略模式实现动态验证不同来源的数据
- 2024-11-11 Java安全编程:公钥加密和私钥签名的实践指南
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)