captcha实现验证码功能

“ 验证码(CAPTCHA)“的演变史 验证码作为人机交互界面经常出现的关键要素,是身份核验、风险防范的重要部件,也是用户交互体验的第一关口,广泛应用在视频、教育、金融、电商、航旅、互联网、公共服务等行业的网站和App上。 验证码的全名是“全自动区分计算机和人类的图灵测试”,利用“人类可以用肉眼轻易识别图片里的文字信息”,以区分出操作者的真伪,在注册、登录、交易等各类场景中发挥着巨大作用。能够防止操作者利用机器软件程序化的垃圾注册、仿冒登录、盗取信息、虚假领取福利、虚假兑换奖品、破解账户密码等,从而保障企业资金安全、营销安全和信息安全。 验证 阅读详情

首先在pom.xml中添加hutool包:

        <dependency>
          <groupId>cn.hutool</groupId>
          <artifactId>hutool-all</artifactId>
          <version>5.2.3</version>
        </dependency>

创建验证码类:CreateCaptcha

public class CreateCaptcha  implements OperationStep{
	private static final Logger logger = LoggerFactory.getLogger(CreateCaptcha.class);
	
	@Override
	public int excute(Operation oper) throws PAIException {
		// TODO Auto-generated method stub
		UUID uuid = UUID.randomUUID();  //生成随机字符串uuid
		//redis中出入的key
		String cacheKey = "captcha:".concat(uuid.toString());
		//获取redis类
		RedisService redisService = oper.getBean("redisService", RedisService.class);
		//随机数
		RandomGenerator randomGenerator = new RandomGenerator("0123456789abcdecghigklmzobqrstuvwsyz", 4);  //生成4个随机数
		//创建验证码
		LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(130,45,4,100);
		lineCaptcha.setGenerator(randomGenerator);
		lineCaptcha.createCode();
		//输出到流
//		try {
//			OutputStream out=oper.getResponse().getOutputStream(); 
//			lineCaptcha.write(out); 
//			
//	        out.flush();
//	        out.close();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
		String code=lineCaptcha.getCode();  //获取验证码
		CaptchaObj captchaoObj=new CaptchaObj();
	    captchaoObj.setKey(uuid.toString());
	    captchaoObj.setCode("data:image/png;base64,"+lineCaptcha.getImageBase64().toString());
		redisService.put(cacheKey, code,300);  //添加到redis中,5分钟后失效
		oper.setTranStepSuccResult(captchaoObj);
		
		return 0;
	}

	@Override
	public int init(Map<String, String> param) {
		// TODO Auto-generated method stub
		return 0;
	}

}

验证码校验类:

CheckCaptchaStep

public class CheckCaptchaStep implements OperationStep{
	private static final Logger logger = LoggerFactory.getLogger(CheckCaptchaStep.class);
	
	@Override
	public int excute(Operation oper) throws PAIException {
		DataContext dc = oper.getContext();
		Map<String, Object> input = StepUtils.getInputValue(oper);
		String codekey=Objects.toString(input.get("codekey").toString(), "");  //获取校验码
		String cacheKey = "captcha:".concat(codekey);   //获取校验码key
		RedisService redisService = oper.getBean("redisService", RedisService.class);   //获取redis类
		String cacheCode = Objects.toString(redisService.get(cacheKey), "");  //获取redis中的验证码
		//判断是否有效
		if (cacheCode.isEmpty()) {
			oper.setTranStepFailureResult("验证码已失效.", cacheCode);
			return -1;
		} else {
			String kaptchaCode = Objects.toString(input.get("kaptchaCode").toString(), "");
			if (kaptchaCode.isEmpty()) {
				oper.setTranStepFailureResult("总线参数名定义错误.", cacheCode);
				return -1;
			} else if (!kaptchaCode.equals(cacheCode)) {  //验证码对比
				oper.setTranStepFailureResult("验证码输入不正确.", kaptchaCode);
				return -1;
			} else {
				redisService.remove(cacheKey);
				oper.setTranStepSuccResult("验证码校验正确.");
				return 0;
			}
		}
	}

	@Override
	public int init(Map<String, String> param) {
		// TODO Auto-generated method stub
		return 0;
	}

}

接口配置文件op_captcha.xml代码:

 <operation-cfg>
	<operation id="getcode" name="获取验证码"  type="api" token="false">
		<step id="getcode" on0Target="return" onOtherTarget="error" class="step.CreateCaptcha">

		</step>
	</operation>
	
	<operation id="kaptcha/check" name="验证码校验"  type="api" token="false">
		<context>
			<Record name="input">
			    <string name="codekey" required="true" desc="唯一值"/>
				<string name="kaptchaCode" required="true" desc="验证码"/>
			</Record>
		</context>
		<step id="insertStep" on0Target="return" onOtherTarget="error" class="step.CheckCaptchaStep">
			<context>
				<string name="mapSet">input</string>
			</context>
		</step>		
	</operation>
	
</operation-cfg>

生成样式

 ajax调用 

	function getCode(){
		$.ajax({
			type: "post",
			dataType:"json",
			url:"http://{}/wtdf/json/getcode",
			success:function(data){
				//console.log(data);
				if(data.errCode==0){
					var codekey=data.data.key;
					$("#vercode").attr("src",data.data.code);  //二进制直接赋给src
				}else{
					layer.msg("验证码获取错误");
				}
			}
		  });
	}

样式 

 

 

springboot+vue项目之使用easy-captcha类库实现获取验证码 使用easy-captcha类库实现获取验证码,并调用RedisTemplate的方法进行设置。可自行参考地址。 阅读详情

相关推荐

Hutool工具包生成验证码的接口

快捷创建:通过快速生成多种样式的验证码。核心接口:所有验证码实现类都遵循ICaptcha接口,统一了方法,如getCode()getImage()和write()。灵活配置:支持传入自定义验证码生成器以及设置多种干扰效果(如圆圈、线条、扭曲),方便开发者根据业务需求灵活配置验证码内容和样式。

gege_0606的博客 1273

SpringBoot验证码之使用hutool-captcha方式实现验证码生成与验证

SpringBoot验证码之使用hutool-captcha方式实现验证码生成与验证

netuser1937的博客 7604

Django集成图片验证码功能:基于django-simple-captcha实现

在Web应用开发中,验证码是防止恶意攻击、自动化脚本滥用的重要手段。本文将介绍如何使用django-simple-captcha库在Django项目中快速集成图片验证码功能,包括安装配置、核心实现代码及使用方法。

分享、交流、合作 766

使用CaptchaUtil工具生成登录验证码

使用CaptchaUtil工具生成登录验证码与校验

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 3488

在登录功能中使用Django中的captcha实现验证码功能

第一步,安装验证码 第二步,在settings.py中的INSTALLED_APPS中注册,并配置url路由 第三步,写一个脚本captcha_forms.py: 第四步:记得重新迁移一下数据库,迁移成功后,会多一个django_captchastore这张表...

PY123456PY123456的博客 1114

用Raspberry Pi Imager重装树莓派系统

这次在官网无意中看到他们出了一个Raspberry Pi Imager的工具,可以直接完成镜像烧录操作,于是就尝了个鲜。选择“编辑设置”按钮,会弹出具体的设置信息,有三个tab,第一个是General信息,包括用户名、密码、wifi和语言设置;后续的操作就和我当初第一次装树莓派系统的操作差不多,在此就不再赘述,有兴趣的朋友可以看我以前的博文。完成定制化设置后,点击“保存”按钮,软件回到前面的提示框,连续点击两个“是”,开始写入SD。第二个下拉框选择你要安装的OS,点击黄框所在的选项,可以挑选更多OS。

天飓的技术博客 1085

基于base64Captcha实现验证码功能

我们可能最初会想到使用redis数据库进行缓存,但是一般的使用场景中,我们其实只需要一个短暂的答案就可以了,所以并不需要,当然也可以。追问:在验证码进行验证的时候,我只是获取了用户的输入,就直接调用Verify方法进行验证了。那么之前生成的验证码的答案在哪里?答案:其实该库自己维护一个全局变量,当使用库时,就已经进行了初始化。MemoryStore用来短暂的存储当前生成的验证码。前端验证代码:(比较简陋,我直接把登录和注册放到一起,可以直接尝试)下面的代码中只有数字、字母、数字+字母的形式。

2303_79380171的博客 764

UE5 VlcMedia 插件编译与流媒体播放实战

本文详细介绍了在虚幻引擎5中编译并集成VlcMedia插件以解决流媒体播放难题的实战指南。针对UE5不再默认支持Win32 API导致的编译错误,文章提供了核心的构建配置文件修改步骤,并指导如何启用插件、创建VLC媒体播放器,最终成功播放如.m3u8等格式的网络直播流或点播视频。

weixin_29013129的博客 339

一文搞懂Go整合captcha实现验证码功能

最近在使用Go语言搞一个用户登录&注册的功能,说到登录&注册相关,我们油然会产生一种增加验证码的想法,因此着手实现,后来在GitHub上找到了这个名叫captcha的插件,于是就利用文档进行了初步的学习,并融入到自己的项目中......

做兴趣使然的Hero 3764

BOSS直聘数据采集实战:八爪鱼工具高效爬取职位信息的完整指南

本文提供了一份使用八爪鱼采集器高效爬取BOSS直聘职位信息的完整实战指南。针对非技术用户,详细讲解了从软件安装、网址规律分析到流程配置、数据导出的每一步操作,并分享了提升采集稳定性的高级设置与避坑技巧,帮助用户轻松实现数据采集自动化。

weixin_29061509的博客 1474

TP4056锂电池充电电路设计原理与工程实践

锂离子电池充电管理是嵌入式电源系统的核心基础技术,其本质是通过恒流恒压(CC/CV)控制策略,匹配电池电化学特性以实现安全、高效、长寿命充放电。TP4056作为典型线性充电IC,以精简外围实现预充、恒流、恒压及自动截止全周期管理,但受限于线性拓扑的热耗散特性,必须协同散热设计、电阻精度选型与PCB布局进行系统级优化。该方案广泛应用于STM32智能小车、便携传感器节点等3.7V单节锂电供电场景,兼顾成本、可靠性与工程可实施性,是入门嵌入式硬件电源设计的关键实践范例。

weixin_36064575的博客 219

SpringBoot使用 easy-captcha 实现验证码登录功能

springboot-vue项目中使用easy-captcha实现验证码登录功能

m0_62909831的博客 3280

【部署】OpenClaw版本降级实操(含全量卸载)

本文详细介绍了OpenClaw工具的降级与卸载方法。主要内容包括:1)通过npm安装指定版本的核心命令及国内镜像加速方案;2)两种卸载路径:CLI工具存在时的简易一键卸载(含交互式与非交互式命令)和手动分步卸载流程;3)CLI已删除但服务仍在运行时,针对macOS(launchd)、Linux(systemd)和Windows(计划任务)系统的具体清理步骤。文章特别强调了卸载前备份的重要性,并提供了不同安装方式(常规安装与源码克隆)的额外说明,确保用户能彻底清理所有组件。

海兰 3171

15_Spring Boot集成AJ-Captcha实现滑动验证码功能

采用嵌入式集成方式,接入方便,安全,高效。抛弃了传统字符型验证码展示-填写字符-比对答案的流程,采用验证码展示-采集用户行为-分析用户行为流程,用户只需要产生指定的行为轨迹,不需要键盘手动输入,极大优化了传统验证码用户体验不佳的问题;同时,快速、准确的返回人机判定结果。

成长需要沉淀。 1567

UG\NX二次开发 一个创建小平面体的例子

介绍。

王牌飞行员_里海的博客 443

【2025最新版】Open3D 区域生长分割(python详细过程版)

点云区域生长分割算法的python详细过程版实现。博客长期更新,本文最新更新时间为:2025年3月23日。

点云侠的博客 9529

python通过captcha实现验证码的功能

1、安装django-simple-captcha pip install django-simple-captcha 2、打开settings.py在INSTALLED_APPS中配置 INSTALLED_APPS = [ 'captcha', ] 3、打开urls.py在urlpatterns中配置url urlpatterns = [ path('captcha',includ...

起风了 4941

国产上位机软件突围:适配统信UOS/麒麟OS的跨平台开发技术与实践(2026年信创实战指南)

(航天科技集团CTO):“在信创战场上,1ms的延迟意味着1个卫星的控制失效。2026年,C#/.NET MAUI不是选择,而是我们守护卫星的‘生命线’。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 408

Spring Boot集成AJ-Captcha实现滑动验证码功能

采用嵌入式集成方式,接入方便,安全,高效。抛弃了传统字符型验证码展示-填写字符-比对答案的流程,采用验证码展示-采集用户行为-分析用户行为流程,用户只需要产生指定的行为轨迹,不需要键盘手动输入,极大优化了传统验证码用户体验不佳的问题;同时,快速、准确的返回人机判定结果。

weixin_49180150的博客 704

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Springboot整合captcha,快速实现验证码功能

captcha“支持数字字母, 算术 (加, 减, 乘法), 中文, gif 动态中文 (一款超简单的验证码生成的框架)”发现一款超简单的验证码生成, 还挺好玩的. 还有中文验证码, 动态...

qq_18244417的博客 3624

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

easy-captcha实现验证码功能

1.添加easy-captcha依赖 <!-- 验证码 --> <dependency> <groupId>com.github.whvcse</groupId> <artifactId>easy-captcha</artifactId> <version>1.6.2</version> </dependency> 2.后端实现 @Controller publi.

Tingnichui的博客 780

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

模拟django-simple-captcha实现中文验证码、数字及字母验证码、计算题验证码功能

最近使用django2.0做网站,开发验证码功能时发现对于我的需求,django-simple-captcha有一些多余的功能,所以从它的源代码中提取了一部分加以修改,生成了一个简单的验证码模块。 在使用django-simple-captcha时发现了一个Bug,该库使用HttpResponse.write(image_data)的方式返回验证码图片数据,导致验证码图片无法显示,具体原因还不清...

旷古的寂寞的博客 5817

终极指南:如何用svg-captcha实现RAP2-delos登录验证码功能

RAP2-delos作为阿里妈妈前端团队出品的开源接口管理工具,其登录验证码功能采用了**svg-captcha**库来实现,这是一个简单高效的验证码解决方案。本指南将详细介绍如何在RAP2-delos项目中配置和使用svg-captcha验证码系统,帮助开发者快速掌握这一重要安全功能的实现方法。 ## 🔐 什么是svg-captcha验证码? svg-captcha是一个基于SVG(可缩放

gitblog_00431的博客 373
上一篇: 通过接口获取校验码
下一篇: linux重启tomcat命令
code12313
博客等级 码龄11年 39粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值