SpringBoot集成Kaptcha验证码

Hi 👋, I'm shy

有人见尘埃,有人见星辰

SHY QR Code

1. 什么是Kaptcha验证码?

Kaptcha是一个强大的开源Java验证码生成库,由Google开发。它能够生成高度可配置的图片验证码,主要用于防止自动化程序滥用web应用,提高应用的安全性。

2. Kaptcha的主要特性

Kaptcha具有以下几个主要特性:

  1. 高度可配置: 可以自定义字体、颜色、大小等多个参数
  2. 多种验证码类型: 支持文字、数学公式等不同类型的验证码
  3. 性能优越: 生成速度快,资源消耗少
  4. 安全性高: 提供多种反爬虫策略

3. Kaptcha的工作原理

Kaptcha生成验证码的过程主要包括以下几个步骤:

  1. 生成随机字符串
  2. 选择字体和颜色
  3. 添加干扰元素(如背景噪点、扭曲等)
  4. 渲染图片

4. 如何使用Kaptcha

4.1 添加依赖

首先,在你的Maven项目的pom.xml文件中添加Kaptcha依赖:

<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version>
</dependency>

4.2 配置Kaptcha

创建一个Kaptcha配置类:

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Properties;@Configuration
public class KaptchaConfig {@Beanpublic DefaultKaptcha getDefaultKaptcha() {DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();// 是否有边框properties.setProperty("kaptcha.border", "yes");// 边框颜色properties.setProperty("kaptcha.border.color", "105,179,90");// 验证码文本字符颜色properties.setProperty("kaptcha.textproducer.font.color", "blue");// 验证码图片宽度properties.setProperty("kaptcha.image.width", "110");// 验证码图片高度properties.setProperty("kaptcha.image.height", "40");// 验证码文本字符大小properties.setProperty("kaptcha.textproducer.font.size", "30");// 验证码存储在session中的keyproperties.setProperty("kaptcha.session.key", "code");// 验证码文本字符长度properties.setProperty("kaptcha.textproducer.char.length", "4");// 验证码文本字体样式properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha;}
}

4.3 创建验证码Controller

import com.google.code.kaptcha.impl.DefaultKaptcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;@RestController
public class CaptchaController {@Autowiredprivate DefaultKaptcha defaultKaptcha;@GetMapping("/captcha")public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {byte[] captchaOutputStream;ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();try {// 生成验证码文字String verifyCode = defaultKaptcha.createText();request.getSession().setAttribute("captcha", verifyCode);BufferedImage challenge = defaultKaptcha.createImage(verifyCode);ImageIO.write(challenge, "jpg", imgOutputStream);} catch (IllegalArgumentException e) {response.sendError(HttpServletResponse.SC_NOT_FOUND);return;}captchaOutputStream = imgOutputStream.toByteArray();response.setHeader("Cache-Control", "no-store");response.setHeader("Pragma", "no-cache");response.setDateHeader("Expires", 0);response.setContentType("image/jpeg");ServletOutputStream responseOutputStream = response.getOutputStream();responseOutputStream.write(captchaOutputStream);responseOutputStream.flush();responseOutputStream.close();}
}

5. 验证码校验

在用户提交表单时,你需要验证用户输入的验证码是否正确。以下是一个简单的示例:

@PostMapping("/verify")
public String verifyCaptcha(HttpServletRequest request, @RequestParam("captcha") String captcha) {String expectedCaptcha = (String) request.getSession().getAttribute("captcha");if (captcha.equals(expectedCaptcha)) {return "验证码正确";} else {return "验证码错误";}
}

6. Kaptcha的高级配置

Kaptcha提供了许多高级配置选项,可以根据需求自定义验证码的外观和行为。以下是一些常用的高级配置及其作用:

6.1 去除干扰线

properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");

这个配置可以去除验证码图片中的干扰线,使图片更加清晰。

在这里插入图片描述

6.2 水纹效果

properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");

这个配置会给验证码图片添加水纹效果,增加识别难度。

在这里插入图片描述

6.3 自定义验证码字符集

properties.setProperty("kaptcha.textproducer.char.string", "0123456789");

这个配置可以自定义验证码中使用的字符集,例如只使用数字和大写字母。

在这里插入图片描述

6.4 调整字符间距

properties.setProperty("kaptcha.textproducer.char.space", "5");

这个配置用于调整验证码字符之间的间距,可以增加或减少难度。
在这里插入图片描述

6.5 渐变背景

properties.setProperty("kaptcha.background.impl", "com.google.code.kaptcha.impl.DefaultBackground");
properties.setProperty("kaptcha.background.clear.from", "green");
properties.setProperty("kaptcha.background.clear.to", "yellow");

这些配置可以为验证码图片添加渐变背景,从绿色过渡到黄色。

在这里插入图片描述

6.6 鱼眼效果

properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.FishEyeGimpy");

这个配置会给验证码添加鱼眼效果,使字符看起来有扭曲感。

在这里插入图片描述

通过组合这些高级配置,你可以创建出各种风格的验证码,既能保证安全性,又能提供良好的用户体验。在实际应用中,建议根据自己的需求和用户反馈来调整这些配置。

6.7 Kaptcha完整配置表清单(V2.3.2)

配置名配置作用默认值
kaptcha.border是否有边框yes
kaptcha.border.color边框颜色black
kaptcha.border.thickness边框粗细1
kaptcha.image.width图片宽度200
kaptcha.image.height图片高度50
kaptcha.producer.impl图片实现类com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl文本实现类com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string文本集合,验证码值从此集合中获取abcde2345678gfynmnpwx
kaptcha.textproducer.char.length验证码长度5
kaptcha.textproducer.font.names字体Arial, Courier
kaptcha.textproducer.font.size字体大小40px
kaptcha.textproducer.font.color字体颜色black
kaptcha.textproducer.char.space文字间隔2
kaptcha.noise.impl干扰实现类com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color干扰颜色black
kaptcha.obscurificator.impl图片样式com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl背景实现类com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from背景颜色渐变,开始颜色light grey
kaptcha.background.clear.to背景颜色渐变,结束颜色white
kaptcha.word.impl文字渲染器com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key存储在session中的keyKAPTCHA_SESSION_KEY
kaptcha.session.date存储在session中的日期KAPTCHA_SESSION_DATE
kaptcha.noise.impl噪点实现类com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color噪点颜色black
kaptcha.obscurificator.impl图片样式com.google.code.kaptcha.impl.WaterRipple
kaptcha.producer.impl图片生成器com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl文本生成器com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string文本集合abcde2345678gfynmnpwx
kaptcha.textproducer.char.length验证码长度5
kaptcha.word.impl文字渲染器com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.background.impl背景实现类com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from背景渐变开始颜色light grey
kaptcha.background.clear.to背景渐变结束颜色white
kaptcha.image.width图片宽度200
kaptcha.image.height图片高度50
kaptcha.gibberish.impl随机字符实现类com.google.code.kaptcha.text.impl.DefaultGibberish
kaptcha.wordrenderer.impl文字渲染器实现类com.google.code.kaptcha.text.impl.DefaultWordRenderer

注意:

  • 某些配置项可能在不同版本的Kaptcha中有所不同。 有些配置项可能重复出现,这是因为它们可能在不同的上下文中使用。
  • 在实际使用中,你通常不需要设置所有这些属性,而只需要根据你的需求选择性地设置一些属性。
  • 对于实现类的配置项,你可以提供自己的实现类来自定义行为。
  • 颜色可以使用英文单词(如"black"、“blue"等)或RGB值(如"255,200,0”)来指定。

7. 安全性考虑

尽管Kaptcha提供了强大的验证码生成功能,但在实际应用中还需要注意以下安全性问题:

  1. 验证码使用后立即失效: 一旦验证码被使用或验证,应该立即从session中删除,防止重复使用。

  2. 限制验证码的有效期: 设置一个合理的过期时间,比如5分钟,超过这个时间验证码自动失效。

  3. 限制验证次数: 对同一个session或IP地址,限制验证码的尝试次数,防止暴力破解。

  4. 结合其他安全措施: 验证码应该是整体安全策略的一部分,可以结合IP限制、用户行为分析等其他安全措施。

  5. 动态难度: 可以根据用户的行为动态调整验证码的难度,对可疑用户使用更难的验证码。

8. Kaptcha的优缺点

优点:

  1. 高度可配置,能满足各种需求
  2. 性能优秀,生成速度快
  3. 安全性高,提供多种反爬虫策略
  4. 与Java生态系统集成良好

缺点:

  1. 可能会影响用户体验,特别是对视力不佳的用户
  2. 仍然可能被高级OCR技术破解
  3. 需要额外的服务器资源来生成和验证

9. 总结

Kaptcha是一个强大而灵活的Java验证码生成库。通过合理的配置和使用,它可以有效地提高web应用的安全性,防止自动化程序的滥用。在实际应用中,我们需要在安全性和用户体验之间找到平衡,并结合其他安全措施,构建一个全面的安全防护体系。

随着技术的发展,验证码可能会逐渐被更先进的身份验证方式所替代,如双因素认证、生物识别等。但在当前阶段,Kaptcha仍然是一个有效的工具,能够为web应用提供必要的保护。

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

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

相关文章

AMEsim液压阀伯德图绘制方法

之前也在液压圈论坛里面发过类似的贴子&#xff0c;具体可以看这个网址&#x1f6aa;&#x1f449;&#xff1a;如何得出说明书里面的伯德图曲线&#xff1f;&#xff0c;回复的人还是比较少&#xff0c;这个方法重要信息是参考百度文库这篇文章&#x1f6aa;&#x1f449;&…

相机的内参与外参

目录 一、相机的内参二、相机的外参 一、相机的内参 如下图所示是相机的针孔模型示意图&#xff1a; 光心O所处平面是相机坐标系(O&#xff0c;P)&#xff0c;像素平面所在坐标系为像素坐标系(O’&#xff0c;P’)。 焦距f&#xff1a;O到O’的距离 相机的内参表示的是相机坐标…

文本编辑三巨头(grep)

目录 正则表达式 元字符 grep 案例 我在编写脚本的时候发现&#xff0c;三个文本编辑的命令&#xff08;grep、sed、awk&#xff0c;被称为文本编辑三剑客&#xff0c;我习惯叫它三巨头&#xff09;用的还挺多的&#xff0c;说实话我一开始学的时候也有些懵&#xff0c;主要…

【实现100个unity特效之8】使用ShaderGraph实现2d贴图中指定部分局部发光效果

最终效果 寒冰法师 火焰法师 文章目录 最终效果寒冰法师火焰法师 素材一、功能分析实现方法基本思路Unity的Bloom后处理为什么关键部位白色&#xff1f;最终结果 二、 新建URP项目三、合并图片四、使用PS制作黑白图片方法一 手动涂鸦方法二 魔棒工具1. 拖入图片进PS&#xff0…

环信+亚马逊云科技服务:助力出海AI社交应用扬帆起航

随着大模型技术的飞速发展&#xff0c;AI智能体的社交体验得到了显著提升&#xff0c;AI社交类应用在全球范围内持续火热。尤其是年轻一代对新技术和新体验的热情&#xff0c;使得AI社交产品在海外市场迅速崛起。作为领先的即时通讯解决方案提供商&#xff0c;环信与亚马逊云科…

# Redis 入门到精通(九)-- 主从复制(2)

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;2&#xff09; 一、redis 主从复制–数据同步阶段注意事项 1、数据同步阶段 master 说明 1&#xff09;如果 master 数据量巨大&#xff0c;数据同步阶段应避开流量高峰期&#xff0c;避免造成 master 阻…

掌握Rust:函数、闭包与迭代器的综合运用

掌握Rust&#xff1a;函数、闭包与迭代器的综合运用 引言&#xff1a;解锁 Rust 高效编程的钥匙函数定义与模式匹配&#xff1a;构建逻辑的基石高阶函数与闭包&#xff1a;代码复用的艺术迭代器与 for 循环&#xff1a;高效数据处理的引擎综合应用案例&#xff1a;构建一个简易…

JavaSE--基础语法--继承和多态(第三期)

一.继承 1.1我们为什么需要继承? 首先&#xff0c;Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程…

Redis的应用场景及类型

目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下&#xff0c;我们就可以把 Mys…

Mysql数据库第四次作业

mysql> create table student(sno int primary key auto_increment,sname varchar(30) not null unique,Ssex varchar(2) check (Ssex男 or Ssex女) not null,Sage int not null,Sdept varchar(10) default计算机 not null); mysql> create table Course(Con int primar…

pytest的安装和介绍和 Exit Code 含义

pytest 准备工作&#xff08;在cmd里&#xff09;&#xff1a; 1安装 pip install -U pytest2验证安装 pytest --version # 会展示当前已安装版本3其他的 显示可用的内置函数参数 pytest --fixtures通过命令行查看帮助信息及配置文件选项 pytest --help一、pytets框架中的…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

从0到1使用Docker部署java项目详解

Docker部署Java项目相比传统部署方式&#xff0c;在环境一致性、配置管理、可扩展性和安全性等方面具有显著优势。然而&#xff0c;它也带来了学习成本、资源消耗和复杂度增加等挑战。 云服务器 白嫖阿里云服务 通过免费试用方式获取自己的阿里云服务器。当然&#xff0c;如…

ElasticSearch(四)— 数据检索与查询

一、基本查询语法 所有的 REST 搜索请求使用_search 接口&#xff0c;既可以是 GET 请求&#xff0c;也可以是 POST请求&#xff0c;也可以通过在搜索 URL 中指定索引来限制范围。 _search 接口有两种请求方法&#xff0c;一种是基于 URI 的请求方式&#xff0c;另一种是基于…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili

python:本机摄像头目标检测实时推理(使用YOLOv8n模型)

本文将介绍如何使用本机摄像头进行目标检测实时推理的python代码。 文章目录 一、下载YOLO权重文件二、环境配置三、完整代码 一、下载YOLO权重文件 https://github.com/ultralytics/ultralytics?tabreadme-ov-file 拉到网页最下面&#xff0c;选择适合的模型&#xff0c;下…

linux禁用root

linux禁用root 1. 禁止普通用户切换到root1.1 sudo -i和sudo -s的区别1.2 sudo -i和直接登录root账号的区别1.3 禁止sudo -i切换root1.4 禁止su - root切换root 2. 禁止root远程登录2.1 ssh禁止root登录2.2 禁止远程桌面登录 本文主要介绍&#xff1a; 如何禁止普通用户切换到r…

python-docx 如何将列表中的值提取到段落中的run以及保存为多个文档?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

如何定位Milvus性能瓶颈并优化

假设您拥有一台强大的计算机系统或一个应用&#xff0c;用于快速执行各种任务。但是&#xff0c;系统中有一个组件的速度跟不上其他部分&#xff0c;这个性能不佳的组件拉低了系统的整体性能&#xff0c;成为了整个系统的瓶颈。在软件领域中&#xff0c;瓶颈是指整个路径中吞吐…

前端网页打开PC端本地的应用程序实现方案

最近开发有一个需求&#xff0c;网页端有个入口需要跳转三维大屏&#xff0c;而这个大屏是一个exe应用程序。产品需要点击这个入口&#xff0c;并打开这个应用程序。这个就类似于百度网盘网页跳转到PC端应用程序中。 这里我们采用添加自定义协议的方式打开该应用程序。一开始可…