当前位置: 首页 > news >正文

Spring Boot整合Kaptcha实现验证码功能

目录

  • 一、前言
    • 1.Kaptcha 简介
    • 2.Kaptcha 详细配置表
  • 二、实现
    • 1.整合kaptcha,创建kaptcha的工具类
      • 1.1 添加依赖
      • 1.2 创建KaptchaConfig工具类
    • 2 编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回
    • 3 登录时从session中获取验证码进行校验
    • 4.测试
      • 4.1 测试获取验证码图片的接口
      • 4.2 登录接口(校验验证码)
  • 三、完整代码

一、前言

kaptcha 是一个很有用的验证码生成工具,由于它有许多可配置项,所以用它可以简单快捷的生成各式各样的验证码。

1.Kaptcha 简介

Kaptcha谷歌验证码) 是一个可高度配置的实用验证码生成工具,可自由配置的选项如:

  • 验证码的字体
  • 验证码字体的大小
  • 验证码字体的字体颜色
  • 验证码内容的范围(数字,字母,中文汉字!)
  • 验证码图片的大小,边框,边框粗细,边框颜色
  • 验证码的干扰线
  • 验证码的样式(鱼眼样式、3D、普通模糊、…)

2.Kaptcha 详细配置表

在这里插入图片描述

二、实现

实现思路:
1.整合kaptcha,创建kaptcha的工具类
2.编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回
3.登录时从 session 中获取验证码进行校验
4.测试获取验证码图片(验证码信息)接口

1.整合kaptcha,创建kaptcha的工具类

1.1 添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--谷歌 验证码-->
<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version>
</dependency>

1.2 创建KaptchaConfig工具类

package com.example.validationcodedemo.config;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;/*** 谷歌验证码配置文件* @author qzz*/
@Configuration
public class KaptchaConfig {@Bean(name = "kaptchaProducer")public DefaultKaptcha getKaptchaBean(){DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();//是否有边框 默认true 也可以自己设置yes,noproperties.setProperty("kaptcha.border", "no");//验证码文本字符颜色 默认为Color.BLACKproperties.setProperty("kaptcha.textproducer.font.color", "black");// 验证码图片宽度 默认为200properties.setProperty("kaptcha.image.width", "160");// 验证码图片高度 默认为50properties.setProperty("kaptcha.image.height", "60");// 验证码文本字符大小 默认为40properties.setProperty("kaptcha.textproducer.font.size", "38");//存储在session中值的keyproperties.setProperty("kaptcha.session.key", "kaptchaCode");// 验证码文本字符长度 默认为5properties.setProperty("kaptcha.textproducer.char.length", "4");// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha;}@Bean(name = "kaptchaProducerMath")public DefaultKaptcha getKaptchaBeanMath(){DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();//是否有边框 默认true 也可以自己设置yes,noproperties.setProperty("kaptcha.border", "yes");//边框颜色properties.setProperty("kaptcha.border.color", "105,179,90");//验证码文本字符颜色 默认为Color.BLACKproperties.setProperty("kaptcha.textproducer.font.color", "black");// 验证码图片宽度 默认为200properties.setProperty("kaptcha.image.width", "160");// 验证码图片高度 默认为50properties.setProperty("kaptcha.image.height", "60");// 验证码文本字符大小 默认为40properties.setProperty("kaptcha.textproducer.font.size", "38");//存储在session中值的keyproperties.setProperty("kaptcha.session.key", "kaptchaCodeMath");//验证码文本生成器properties.setProperty("kaptcha.textproducer.impl","com.tonglei.config.KaptchaTextCreator");// 验证码文本字符间距 默认为2properties.setProperty("kaptcha.textproducer.char.space", "3");// 验证码文本字符长度 默认为5properties.setProperty("kaptcha.textproducer.char.length", "4");// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");// 验证码噪点颜色 默认为Color.BLACKproperties.setProperty("kaptcha.noise.color", "black");// 干扰实现类  DefaultNoise\NoNoiseproperties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");Config config = new Config(properties);defaultKaptcha.setConfig(config);return defaultKaptcha;}
}

2 编写接口,在接口中使用 kaptcha 工具类来生成验证码图片(验证码信息)并返回

编写获取验证码图片或者验证码信息功能接口:

package com.example.validationcodedemo.controller;import com.google.code.kaptcha.Producer;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
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.IOException;/*** 验证码* @author qzz*/
@RestController
public class ValidationCodeController {@Autowiredprivate Producer kaptchaProducer;@Autowiredprivate Producer kaptchaProducerMath;/*** 生成验证码图片* @param request* @param response*/@RequestMapping("/createKaptchaCodeImg")public void createKaptchaCode(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setHeader("Cache-Control","no-store");response.setContentType("image/jpeg");//文本验证码String text = kaptchaProducer.createText();//图片验证码BufferedImage image = kaptchaProducer.createImage(text);//保存验证码到sessionrequest.getSession().setAttribute("kaptchaCode",text);ServletOutputStream outputStream = response.getOutputStream();//设置写出图片的格式ImageIO.write(image,"jpg",outputStream);//关闭输出流IOUtils.closeQuietly(outputStream);}/*** 生成验证码图片(有边框)* @param request* @param response*/@RequestMapping("/createKaptchaCodeImg2")public void createKaptchaCode2(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setHeader("Cache-Control","no-store");response.setContentType("image/jpeg");//文本验证码String text = kaptchaProducer.createText();//图片验证码BufferedImage image = kaptchaProducerMath.createImage(text);//保存验证码到sessionrequest.getSession().setAttribute("kaptchaCodeMath",text);ServletOutputStream outputStream = response.getOutputStream();//设置写出图片的格式ImageIO.write(image,"jpg",outputStream);//关闭输出流IOUtils.closeQuietly(outputStream);}

3 登录时从session中获取验证码进行校验

    /*** 用户登录 校验验证码*/@PostMapping("/login")public Result login(@RequestBody UserLoginRequestJson requestJson,HttpServletRequest request){Result result = new Result();//从session中获取验证码String kaptchaCode = String.valueOf(request.getSession().getAttribute("kaptchaCode"));//用户输入和session获取的验证码进行验证if (!requestJson.getCode().equals(kaptchaCode)){//验证码验证失败return Result.fail(10910,"验证码不正确,请重新输入");}//登录流程...(省略)return Result.success();}

注意:从session中获取验证码时,key值一定要和前面生成验证码时存储的key保持一致。

4.测试

4.1 测试获取验证码图片的接口

在这里插入图片描述

4.2 登录接口(校验验证码)

验证码输入错误:
在这里插入图片描述

验证码输入正确:
在这里插入图片描述

三、完整代码

可点击此处下载

相关文章:

Spring Boot整合Kaptcha实现验证码功能

目录一、前言1.Kaptcha 简介2.Kaptcha 详细配置表二、实现1.整合kaptcha&#xff0c;创建kaptcha的工具类1.1 添加依赖1.2 创建KaptchaConfig工具类2 编写接口&#xff0c;在接口中使用 kaptcha 工具类来生成验证码图片&#xff08;验证码信息&#xff09;并返回3 登录时从sess…...

【2023】某python语言程序设计跟学第一周内容

本文说明&#xff1a; 案例内容为北理工python语言程序设计课程&#xff0c;如有不妥请联系&#xff01; 目录温度转换案例&#xff1a;执行结果&#xff1a;代码解析&#xff1a;白话说明&#xff1a;举一反三&#xff1a;根据输入半径求圆周长或面积执行结果&#xff1a;温度…...

C#学习记录——接口的实现

一小部分知识精英依旧直面核心困难&#xff0c;努力地进行深度钻研&#xff0c;生产内容&#xff1b;而大多数信息受众始终在享受轻度学习&#xff0c;消费内容。如果我们真的希望在时代潮流中占据一席之地&#xff0c;那就应该尽早抛弃轻松学习的幻想&#xff0c;锤炼深度学习…...

“ChatGPT之父”Sam Altman:我是如何成功的?

背靠微软&#xff0c;OpenAI能拳打谷歌&#xff0c;脚踢Meta&#xff0c;它背后的男人&#xff0c;必然不简单。 让我们来看一看&#xff0c;Sam Altman是如何一步步成长为今天这个搅动全世界的男人。 山姆奥特曼&#xff08;Sam Altman&#xff09; 成长和创业经历 在YC创始…...

jQuery发送Ajax请求的几种方式

概述JQuery发送ajax请求的方法有很多&#xff0c;其中最基本的方法是$.ajax&#xff0c;在其中封装的方法有 $.get, $post等。我们分别举了不同的示例。数据格式首先&#xff0c;浏览器与服务器之间传输数据所采用的格式&#xff0c;比较常见的有json&#xff0c;jsonp&#xf…...

Android实现连线题效果

效果图全部正确&#xff1a;有对有错&#xff1a;结果展示&#xff0c;纯黑色&#xff1a;支持图片&#xff1a;实现思路仔细分析可以发现&#xff0c;连线题的布局可以分为两部分&#xff0c;一个是左右两列矩形&#xff0c;另一个是他们之间的连线。每个矩形的宽高都一样&…...

以数据 见未来!首届未来数商大会成功举办

2月25日&#xff0c;2023未来数商大会在杭州未来科技城学术交流中心举办。大会发布了数商产业趋势研究报告&#xff0c;首次提出并探讨了完整的数商产业概念&#xff0c;并成立了未来数商联盟&#xff0c;开通了浙江大数据交易服务平台余杭专区。会上&#xff0c;杭州未来科技城…...

Java数据结构与算法——手撕LRULFU算法

LRU算法 力扣146&#xff1a;https://leetcode-cn.com/problems/lru-cache/ 讲解视频&#xff1a;https://www.bilibili.com/video/BV1Hy4y1B78T?p65&vd_source6f347f8ae76e7f507cf6d661537966e8 LRU是Least Recently Used的缩写&#xff0c;是一种常用的页面置换算法&…...

20230227英语学习

Can Clay Capture Carbon Dioxide? 低碳新思路&#xff1a;粘土也能吸收二氧化碳&#xff01; The atmospheric level of carbon dioxide — a gas that is great at trapping heat, contributing to climate change — is almost double what it was prior to the Industria…...

校招前端高频react面试题合集

了解redux吗&#xff1f; redux 是一个应用数据流框架&#xff0c;主要解决了组件之间状态共享问题&#xff0c;原理是集中式管理&#xff0c;主要有三个核心方法&#xff1a;action store reduce 工作流程 view 调用store的dispatch 接受action传入的store&#xff0c;reduce…...

k8s node之间是如何通信的?

承接上文同一个node中pod之间如何通信&#xff1f;单一Pod上的容器是怎么共享网络命名空间的&#xff1f;每个node上的pod ip和cni0网桥ip和flannel ip都是在同一个网段10.1.71.x上。cni0网桥会把报文发送flannel这个网络设备上&#xff0c;flannel其实是node上的一个后台进程&…...

System V|共享内存基本通信框架搭建|【超详细的代码解释和注释】

前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结&#xff0c;每一篇都是超级用心编写的&#xff0c;有兴趣的伙伴们都支…...

魔兽世界WoW注册网站搭建——-Liunx

问题背景哎 搭建了一个魔兽3.35&#xff08;纯洁版&#xff09;每当同学朋友要玩的时候我都直接worldserver上面打一个命令随之出现朋友的朋友也要玩想了想还是要有一个网站原本以为吧单机版里面网页的IP数据库改下可以了结果PHP报错了Unknown column sha_pass_hash in field l…...

OSG三维渲染引擎编程学习之六十八:“第六章:OSG场景工作机制” 之 “6.8 OSG内存管理”

目录 第六章 OSG场景工作机制 6.8 OSG内存管理 6.8.1 Referenced类 6.8.2 ref_ptr<>模板类 6.8.3 智能指针...

字节前端必会面试题(持续更新中)

事件传播机制&#xff08;事件流&#xff09; 冒泡和捕获 谈一谈HTTP数据传输 大概遇到的情况就分为定长数据 与 不定长数据的处理吧。 定长数据 对于定长的数据包而言&#xff0c;发送端在发送数据的过程中&#xff0c;需要设置Content-Length,来指明发送数据的长度。 当…...

内存数据库-4-[redis]在ubuntu中离线安装

Ubuntu20.04(linux)离线安装redis 官网redis下载地址 下载安装包redis-6.0.9.tar.gz。 1 下载安装 (1)解压 sudo tar -xzvf redis-6.0.9.tar.gz -C /usr/local/ cd /usr/local/redis-6.0.9/(2)编译 sudo make(3)测试 sudo dpkg -i libtcl8.6_8.6.10dfsg-1_amd64.deb sudo d…...

并非从0开始的c++ day8

并非从0开始的c day8结构体结构体嵌套二级指针练习结构体偏移量内存对齐内存对齐的原因如何内存对齐文件操作文件的概念流的概念文本流二进制流文件缓冲区文件打开关闭文件关闭fclose文件读写函数回顾按格式化读写文件文件读写注意事项结构体 结构体嵌套二级指针练习 需求&am…...

ubuntu下用i686-w64-mingw32交叉编译支持SDL、Openssl的ffmpeg库

前言 本篇博客是基于前两篇关于ffmpeg交叉编译下&#xff0c;进行再次编译操作。ubuntu下ffmpeg的交叉编译环境搭建可以参看以下我的这篇博客&#xff1a;https://blog.csdn.net/linyibin_123/article/details/108759367 &#xff1b; ubuntu下交叉编译openssl及交叉编译支持o…...

对IDEA中断点Suspend 属性理解

suspend的类型分为 1、ALL&#xff1a;有线程进入该断点时&#xff0c;暂停所有线程 2、Thread&#xff1a;有线程进入该断点时&#xff0c;只暂停该线程 讨论下不同线程在同一时间段都遇到断点时&#xff0c;idea的处理方法。假如在执行时间上&#xff0c;thread1会先进入断…...

IM即时通讯开发如何解决大量离线消息导致客户端卡顿的

大部分做后端开发的朋友&#xff0c;都在开发接口。客户端或浏览器h5通过HTTP请求到我们后端的Controller接口&#xff0c;后端查数据库等返回JSON给客户端。大家都知道&#xff0c;HTTP协议有短连接、无状态、三次握手四次挥手等特点。而像游戏、实时通信等业务反而很不适合用…...

告别简单门禁:用KP-ABE(密钥策略属性基加密)为你的云盘文件打造精细到‘行’的访问控制

告别简单门禁&#xff1a;用KP-ABE为云盘文件打造精细到"行"的访问控制 想象一下这样的场景&#xff1a;一份包含市场预算、产品路线图和财务数据的项目文档&#xff0c;需要让市场团队查看营销章节但隐藏成本细节&#xff0c;允许产品经理编辑技术方案但仅能阅读财务…...

ONFI5.0实战避坑:VccQ电压选1.8V还是1.2V?DQS采样与ZQ校准那些事儿

ONFI5.0硬件设计实战&#xff1a;VccQ电压选择与信号完整性优化指南 在嵌入式存储系统设计中&#xff0c;ONFI5.0协议的采用正成为行业新标准&#xff0c;但随之而来的硬件兼容性问题也让不少工程师头疼。最近一位同行就遇到了典型的案例&#xff1a;他们的NV-DDR3接口NAND闪存…...

从单图到分层设计:AI智能图层分离工具layerdivider完全指南

从单图到分层设计&#xff1a;AI智能图层分离工具layerdivider完全指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的插画图层分离而烦恼吗…...

Verdi Debug Mode避坑指南:解决Transaction采集不全、VIP协议分析的那些‘坑’

Verdi Debug Mode深度排障手册&#xff1a;从Transaction采集到VIP协议分析的实战避坑指南 在芯片验证的复杂战场上&#xff0c;Verdi的Debug Mode就像一把瑞士军刀——功能强大但需要精准操作。当你在凌晨三点盯着FSDB文件中缺失的Transaction数据&#xff0c;或是面对SNPS VI…...

告别重复劳动:三月七小助手如何让你的星穹铁道效率提升300%

告别重复劳动&#xff1a;三月七小助手如何让你的星穹铁道效率提升300% 【免费下载链接】March7thAssistant 崩坏&#xff1a;星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否每天花费大量时间在《崩坏&#xff1a;…...

Clawforge SaaS Starter:基于云端AI与Docker的本地开发环境部署指南

1. 项目概述与核心价值 如果你正在寻找一个能快速启动、专注于AI驱动的SaaS应用开发的本地开发环境&#xff0c;并且希望绕过本地GPU部署的复杂性和高昂成本&#xff0c;那么Clawforge SaaS Starter就是你一直在等的那个“开箱即用”的解决方案。这个项目本质上是一个经过精心…...

Cursor Pro破解工具终极指南:2025年免费解锁AI编程助手完整功能

Cursor Pro破解工具终极指南&#xff1a;2025年免费解锁AI编程助手完整功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached…...

Claude Code 在 JetBrains IDE 的用户指南

Claude Code 是由 Anthropic 推出的智能编码工具&#xff0c;作为全球最强大的编程助手之一&#xff0c;Claude Code 提供了专门的 JetBrains IDE 插件&#xff0c;支持包括 IntelliJ IDEA、PyCharm、WebStorm、GoLand、PhpStorm 和 Android Studio 在内的整个 JetBrains IDE 系…...

NsEmuTools:3步搞定NS模拟器安装配置的终极免费工具

NsEmuTools&#xff1a;3步搞定NS模拟器安装配置的终极免费工具 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 还在为复杂的NS模拟器安装而烦恼吗&#xff1f;NsEmuTools是一款专为Switc…...

树莓派SPI屏幕Python GUI开发:Pillow+Adafruit打造动态监控仪表盘

1. 项目概述与核心价值在嵌入式开发领域&#xff0c;尤其是物联网和智能硬件项目中&#xff0c;一个直观、动态的图形界面往往是连接设备与用户的桥梁。你可能已经习惯了通过串口打印日志来调试&#xff0c;或者用几个LED灯来指示状态&#xff0c;但当你的项目需要展示更丰富的…...