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.xdnf.cn/news/1488100.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3.3-LSTM的改进

文章目录 1改进点1.1多层化1.2 dropout1.2.1具体概念1.2.2应该插入到LSTM模型的哪里 1.3权重共享 2改进之后的LSTMLM的代码实现2.1初始化2.2前向计算2.3反向传播 3相应的学习代码的实现4总结 1改进点 1.1多层化 加深神经网络的层数往往能够学习更复杂的模式&#xff1b;因此这…

AI学习记录 - 图像识别的基础入门

代码实现&#xff0c;图像识别入门其实非常简单&#xff0c;这里使用的是js&#xff0c;其实就是把二维数组进行公式化处理&#xff0c;处理方式如上图&#xff0c;不同的公式代表的不同的意义&#xff0c;这些意义网上其实非常多&#xff0c;这里就不细讲了。 const getSpecif…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量&#xff0c;现在要学…

C++入门基础:C++中的循环语句

循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用&#xff0c;比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈&#xff0c;有时候一不小心会构成死循环或者…

服务器利用宝塔面板部署Django项目

目录 1. 使用命令启动Django项目1.1 使用 Xshell 连接服务器1.2 安装Anaconda1.3 启动Django项目1.4 使用tmux实现项目的后台运行 2. 使用Python项目管理器部署项目2.1 安装宝塔面板和软件2.2 添加站点2.3 上传项目文件2.3.1 收集静态文件2.3.2 生成依赖文件 2.4 安装安装Pytho…

【笔记】学习记录

2024年7月23日 1.图的5中存储方式 2.二叉树的先序&#xff0c;中序&#xff0c;后序遍历。 学了图的存储方式之后&#xff0c;二叉树好像就是小菜一碟一样。注意一下名词的顺序就可以了。 所谓先中后序&#xff0c;就是先根&#xff0c;中根&#xff0c;后根的差别。没有其…

FoundationDB 基本使用

目录 一、FoundationDB介绍 二、安装单机版FoundationDB 2.1 下载安装程序 2.2 安装FoundationDB 2.3 修改配置信息 2.4 管理FoundationDB服务 三、fdbcli的常用命令 3.1连接数据库 3.2退出fdbcli 3.3查看版本 3.4 写模式 3.5写入键值 3.6读取键值 3.7删除键值 …

学习笔记之JAVA篇(0724)

p 方法 方法声明格式&#xff1a; [修饰符1 修饰符2 ...] 返回值类型 方法名&#xff08;形式参数列表&#xff09;{ java语句;......; } 方法调用方式 普通方法对象.方法名&#xff08;实参列表&#xff09;静态方法类名.方法名&#xff08;实参列表&#xff09; 方法的详…

Java之泛型基础

泛型 1 问题引入 在前面学习集合时&#xff0c;我们都知道集合中是可以存放任意对象的&#xff0c;只要把对象存储集合后&#xff0c;那么这时他们都会被提升成Object类型。当我们在取出每一个对象&#xff0c;并且进行相应的操作&#xff0c;这时必须采用类型转换。 观察下…

视频去水印免费电脑版 pdf压缩在线免费网页版 pdf压缩在线免费 简单工具软件详细方法步骤分享

消除视频中的恼人水印&#xff0c;是许多视频编辑爱好者的常见需求。在这篇文章中&#xff0c;我们将探讨几种视频去水印的技巧&#xff0c;在数字化时代&#xff0c;视频和图片的传播越来越方便&#xff0c;但随之而来的水印问题也让人头疼。本文将为您详细介绍视频剪辑去水印…

vue环境安装

安装node.js 网址&#xff1a;https://nodejs.org/en/download/ 直接点击下载就ok 一路next&#xff0c;这里可以改一下保存路径 选第一个 安装后&#xff0c;找到node.js的安装目录&#xff0c;创建这两个文件夹 之后打开命令提示符&#xff0c;右键以管理员身份运行 将新创…

智能猫砂盆买开放式还是封闭式?四年养猫老手实用测评三个品牌!

有没有人跟我一样&#xff0c;买过封闭式的智能猫砂盆回来&#xff0c;结果猫咪不爱用&#xff0c;死活不肯进去&#xff0c;搞得智能猫砂盆白买了&#xff0c;但是平时上班太忙碌&#xff0c;真的很需要一个可以帮自己铲屎的智能猫砂盆&#xff0c;后面恶补了一下知识&#xf…

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

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

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

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述&#xff1a; MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片&#xff0c;能够根据不同的型号配置来实现对XY&#xff0…

android前台服务

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用2.1 添加权限2.2 新建…

MT2142 逆序(树状数组)

思路&#xff1a; 开始完全没有思路&#xff0c;还是想问题的方法不对&#xff08;应该先暴力模拟&#xff0c;然后再想可以优化的方法&#xff09;。 后来看了解析&#xff0c;用chang[]来存储每个元素删除后&#xff08;或者是该元素前面的元素删除后&#xff09;对record造成…

肿瘤演变指标预测局部晚期前列腺癌10年以上的复发| 文献速递-基于人工智能(AI base)的医学影像研究与疾病诊断

Title 题目 Tumor evolution metrics predict recurrence beyond 10 years in locally advanced prostate cancer 肿瘤演变指标预测局部晚期前列腺癌10年以上的复发 01 文献速递介绍 癌症演变为预测肿瘤学奠定了基础。测试进化指标需要在控制临床试验中进行定量测量。我们…

STM32---HAL库基础配置记录之基础配置

一&#xff1a;第一步是时钟RCC的使能配置 时钟配置界面如下&#xff0c;当我们选定好芯片型号时&#xff0c;首先需要配置的是RCC&#xff0c;如下图&#xff1a; 其中第一个HSE代表的是时钟树的高速外部时钟对应下图中的1&#xff0c;LSE代表的是下图中的2 如下图&#xff0c…