返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现滑动验证码生成(后端工具类)
  • 243
分享到

Java实现滑动验证码生成(后端工具类)

Java滑动验证码Java验证码 2022-11-13 18:11:54 243人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、滑动验证码生成思路二、主要方法三、生成代码四、测试结果一、滑动验证码生成思路 1、随机选择一张图片 2、生成滑块起点位置(x, y) 3、生成滑块轮廓 4、抠出滑块 5、将滑

一、滑动验证码生成思路

1、随机选择一张图片

2、生成滑块起点位置(x, y)

3、生成滑块轮廓

4、抠出滑块

5、将滑块部位去除颜色

二、主要方法

这里使用的方法是:先抠出中间的正方形,再将凹凸槽的RGB渲染上去

1、扣主体

将自定义滑块大小扩大三分之二,用来做凸槽

2、抠凸槽

因为凸槽是个圆,所以可通过圆的标准方程

三、生成代码

滑块验证码实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImageSlideVerify {

    private String bgImg;// 底部图片
    private String blockImg;// 滑块图片
    private Integer x;// 开始x
    private Integer y;// 开始y
    private Integer bound;// 误差值
}

生成滑块验证码

import com.yang.domain.vo.ImageSlideVerify;
import org.apache.Tomcat.util.codec.binary.Base64;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Random;
import java.util.UUID;

import javax.imageio.ImageIO;


public class ImageSlideVerifyUtil {
	
	private static Integer x, y;// x , y轴起点位置
	private static Integer blockSize; // 块大小

	public static void main(String[] args) throws IOException {
		File file = new File("4.jpeg");
		cutting(file, 80);
		cutting(file);
	}
	
	
	// 切割
	public static ImageSlideVerify cutting(File file, int size) {
		FileInputStream fis;
		blockSize = size;
		
		try {
			fis = new FileInputStream(file);
			BufferedImage image = ImageIO.read(fis);// 将文件流转图像流
			
			// 生成圆位置
			Integer cp[] = circle();// 下标对应:上右下左
			
			// 生成滑块
			BufferedImage img = generateMin(image, image.getWidth(), image.getHeight(), size, cp);
			// 图片转base64
			String bgImg = imageToBase64(image);
			String blockImg = imageToBase64(img);
			// TODO 保存图片:用于测试,测试完毕删除
			// ImageIO.write(img, "png", new File("4-1.png"));
			// ImageIO.write(image, "png", new File("4-2.png"));
			
			ImageSlideVerify imageSlideVerify = new ImageSlideVerify(bgImg, blockImg, x, y, 3);

			return imageSlideVerify;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	// 切割
	public static ImageSlideVerify cutting(File file) {
		return cutting(file, 60);
	}
	
	// 圆的位置
	private static Integer[] circle() {
		
		Integer c[] = new Integer[4];// 四个位置有圆,0代表无,1代表有,下标对应上、右、下、左
		boolean flag = false;// 记录是否有圆
		while(!flag) {// 如果没有圆,则继续循环,至少要有一个圆(凸槽)
			for(int i = 0; i < 4; i++) {
				c[i] = new Random().nextInt(2);
				if(c[i] == 1) {
					flag = true;
				}
			}
		}
		return c;
	}
	
	
	private static BufferedImage generateMin(BufferedImage img, int width, int height, int size, Integer[] cp) throws IOException {

		
		int size1 = size + (size / 3 * 2);
		
		int maxX = width - ( size1 );
		int maxY = height - ( size1 );
		
		// 生成滑块开始位置
		x = new Random().nextInt(maxX);
		y = new Random().nextInt(maxY);
		// 创建滑块图像
		BufferedImage img1 = new BufferedImage(size1, size1, BufferedImage.TYPE_INT_RGB);
		Graphics2D gr = img1.createGraphics();
		// 图像背景透明
		img1 = gr.getDeviceConfiguration().createCompatibleImage(size1, size1, Transparency.TRANSLUCENT);
		
		// 拷贝rgb
		for(int i = 0; i < size1; i++) {
			for(int j = 0; j < size1; j++) {
				if(i < size / 3 || i > size + size / 3 || j < size / 3 || j > size + size / 3) {
					continue;
				}
				// 渲染RGB
				img1.setRGB(i, j, img.getRGB(i + x, j + y));
				// 将原图像素点覆盖白色
				Color color = new Color(255,255,255);
				img.setRGB(i + x, j + y, color.getRGB());
			}
		}
		// 设置圆(凸槽)
		setCircle(img, img1, x, y, cp);
		return img1;
	}
	
	private static void setCircle(BufferedImage oldImg, BufferedImage img, int x, int y, Integer[] cp) throws IOException {
		// 以白色覆盖原图像素点
		Color color = new Color(255,255,255);

		int d = blockSize / 3 + 2; // 直径
		int r = d / 2;// 半径
		
		if(cp[0] == 1) {// 上
			// 中心位置
			int w = img.getWidth() / 2;
			
			for(int i = w - r, r1 = 0; i < w + r; i++, r1++) {
				for(int j = 0, r2 = 0; j < d; j++, r2++) {
					
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - 11) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) {
							continue;
						}
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 对应位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[1] == 1) {// 右
			// 中心位置
			int h = img.getHeight() / 2;
			for(int i = img.getWidth() - d, r1 = 0; i < img.getWidth(); i++, r1++) {
				for(int j = h - r, r2 = 0; j < h + r; j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 对应位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[2] == 1) {// 下
			// 中心位置
			int w = img.getWidth() / 2;
			
			for(int i = w - r, r1 = 0; i < w + r; i++, r1++) {
				for(int j = img.getHeight() - d, r2 = 0; j < img.getHeight(); j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 对应位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
		if(cp[3] == 1) {// 左
			// 中心位置
			int h = img.getHeight() / 2;
			for(int i = 0, r1 = 0; i < d; i++, r1++) {
				for(int j = h - r, r2 = 0; j < h + r; j++, r2++) {
					if((r1 - r) * (r1 - r) + (r2 - r) * (r2 - r) <= r * r) {
						if(oldImg.getRGB(x + i, y + j) == color.getRGB()) continue;
						img.setRGB(i, j, oldImg.getRGB(x + i, y + j));
						// 对应位置透明
						oldImg.setRGB(x + i, y + j, color.getRGB());
					}
				}
			}
		}
	}

	
	private static String imageToBase64(BufferedImage img){
		ByteArrayOutputStream stream = new ByteArrayOutputStream();
		try {
			// 设置图片的格式
			ImageIO.write(img, "png", stream);
			byte[] bytes = Base64.encodeBase64(stream.toByteArray());
			String base64 = new String(bytes);
			return  "data:image/jpeg;base64,"+base64;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

四、测试结果

这里看滑块是白色背景,实际上是透明的

生成完成

web前端代码

到此这篇关于Java实现滑动验证码生成(后端工具类)的文章就介绍到这了,更多相关Java滑动验证码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现滑动验证码生成(后端工具类)

本文链接: https://lsjlt.com/news/170279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java实现滑动验证码生成(后端工具类)
    目录一、滑动验证码生成思路二、主要方法三、生成代码四、测试结果一、滑动验证码生成思路 1、随机选择一张图片 2、生成滑块起点位置(x, y) 3、生成滑块轮廓 4、抠出滑块 5、将滑...
    99+
    2022-11-13
    Java滑动验证码 Java 验证码
  • 怎么用java工具类生成验证码
    要使用Java工具类生成验证码,可以按照以下步骤进行操作: 创建一个名为CaptchaUtil的Java工具类。 导入java.u...
    99+
    2023-10-21
    java
  • Java实现动态验证码生成
    本文实例为大家分享了Java动态验证码生成的具体代码,供大家参考,具体内容如下 说明:今天给大家来带来一个自动生成验证码的处理方法。验证码的出现有效减少了注入灌水以及破解密码等恶意操...
    99+
    2024-04-02
  • Java实现滑动验证码(前端部分)
    目录实现思路实现代码实现结果实现思路 1、请求后端获得背景图、滑块、x、y、误差范围bound 2、将滑块设置到对应的位置:top = y 3、添加鼠标滑动事件 实现代码 后端请求(...
    99+
    2022-11-13
    Java滑动验证码 Java 验证码
  • java后台验证码生成的实现方法
    效果图如下: 1.适用需求 后台生成验证码,用于登陆验证。 2. 功能实现所需控件/文件: 无(普通标签) 3.功能点实现思路 1)前台思路: (1)前台一个<input&g...
    99+
    2024-04-02
  • Java如何实现滑动验证码
    小编给大家分享一下Java如何实现滑动验证码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!功能:java实现滑动验证码项目是采用springboot,maven开发工具:采用idea1.效果演示2.后端代码控制层@Cont...
    99+
    2023-06-29
  • 利用java实现验证码生成并完成验证
    利用java实现验证码生成并完成验证?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java 制作验证码并进行验证实例详解在注册、登录的页面上经常会出现验证码,为...
    99+
    2023-05-31
    java 验证码 ava
  • 利用Java工具类Hutool实现验证码校验功能
    目录Hutool工具类介绍Hutool实现验证码生成测试验证码生成其他样式的验证码第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageI...
    99+
    2022-11-13
    Hutool生成验证码 Hutool工具类 java验证码校验
  • java后台验证码如何生成
    这篇文章给大家分享的是有关java后台验证码如何生成的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图如下:1.适用需求后台生成验证码,用于登陆验证。2. 功能实现所需控件/文件:无(普通标签)3.功能点实现思...
    99+
    2023-06-15
  • Java如何实现验证码生成
    这篇文章主要介绍了Java如何实现验证码生成,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般...
    99+
    2023-05-30
    java
  • Java实现滑动验证码的示例代码
    目录1.效果演示2.后端代码控制层工具类3.前端页面功能:java实现滑动验证码 项目是采用springboot,maven 开发工具:采用idea 1.效果演示 2.后端代码...
    99+
    2024-04-02
  • php如何实现自动生成验证码
    本文操作环境:windows10系统、php 7、thinkpad t480电脑。现在验证码在表单中的应用越来越多了,但是如果用js来实现总觉得不太方便,因此使用php来实现下,在此记录下。当然,我们也可以封装成一个函数,以后使用的时候也是...
    99+
    2019-06-04
    php 验证码
  • android端实现验证码随机生成功能
    本文实例为大家分享了android端生成随机验证码的具体代码,供大家参考,具体内容如下package com.nobeg.util; import java.util.Random; import android.graphics.Bi...
    99+
    2023-05-30
    android 验证码 roi
  • java随机验证码生成实现实例代码
    java随机验证码生成实现实例代码摘要: 在项目中有很多情况下都需要使用到随机验证码,这里提供一个java的随机验证码生成方案,可以指定难度,生成的验证码可以很方便的和其他组件搭配之前要使用一个生成随机验证码的功能,在网上找了一下,有很多的...
    99+
    2023-05-31
    java 随机 验证码
  • .NET如何实现滑动验证码
    本篇内容介绍了“.NET如何实现滑动验证码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!CaptchaData.csCaptchaData....
    99+
    2023-07-04
  • java实现随机验证码图片生成
    本文实例为大家分享了java生成随机验证码图片的具体代码,供大家参考,具体内容如下 1.controller @GetMapping(value = "/getRan...
    99+
    2024-04-02
  • SpringBoot实现Thymeleaf验证码生成
    使用后台返回验证码图片,验证码存到session中后端实现校验,前端只展示验证码图片。 本篇用SpringBoot Thymeleaf实现验证码生成。 创建springboot项...
    99+
    2024-04-02
  • Java实现滑块拼图验证码
    本文实例为大家分享了Java实现滑块拼图验证码的具体代码,供大家参考,具体内容如下 1、后端随机生成抠图和带有抠图阴影的背景图片,后台保存随机抠图位置坐标 2、前端实现滑动交互,将抠...
    99+
    2024-04-02
  • C#滑动验证码拼图验证功能实现(SlideCaptcha)
    目录使用背景:实现分析:后端代码:准备:使用:前端代码:结语:使用背景: 关于滑动验证码的使用场所还是非常多的,如:调取短信接口之前,和 注册请求之前 或者 频繁会调用的接口都需要加...
    99+
    2024-04-02
  • JavaScript+html实现前端页面滑动验证
    本文实例为大家分享了JavaScript+html实现前端页面滑动验证的具体代码,供大家参考,具体内容如下 分享炫酷的前端页面滑动验证 直接上代码 <%@ page con...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作