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

news2024/9/30 11:37:03

目录

  • 一、前言
    • 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,no
        properties.setProperty("kaptcha.border", "no");
        //验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.textproducer.font.color", "black");
        // 验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "160");
        // 验证码图片高度 默认为50
        properties.setProperty("kaptcha.image.height", "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty("kaptcha.textproducer.font.size", "38");
        //存储在session中值的key
        properties.setProperty("kaptcha.session.key", "kaptchaCode");
        // 验证码文本字符长度 默认为5
        properties.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.ShadowGimpy
        properties.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,no
        properties.setProperty("kaptcha.border", "yes");
        //边框颜色
        properties.setProperty("kaptcha.border.color", "105,179,90");
        //验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.textproducer.font.color", "black");
        // 验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "160");
        // 验证码图片高度 默认为50
        properties.setProperty("kaptcha.image.height", "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty("kaptcha.textproducer.font.size", "38");
        //存储在session中值的key
        properties.setProperty("kaptcha.session.key", "kaptchaCodeMath");
        //验证码文本生成器
        properties.setProperty("kaptcha.textproducer.impl","com.tonglei.config.KaptchaTextCreator");
        // 验证码文本字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "3");
        // 验证码文本字符长度 默认为5
        properties.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.ShadowGimpy
        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
        // 验证码噪点颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.noise.color", "black");
        // 干扰实现类  DefaultNoise\NoNoise
        properties.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 {

    @Autowired
    private Producer kaptchaProducer;
    @Autowired
    private 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);
        //保存验证码到session
        request.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);
        //保存验证码到session
        request.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 登录接口(校验验证码)

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

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

三、完整代码

可点击此处下载

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

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

相关文章

阻塞队列BlockingQueue

一、概念阻塞队列&#xff1a;从名字可以看出&#xff0c;他也是队列的一种&#xff0c;那么他肯定是一个先进先出&#xff08;FIFO&#xff09;的数据结构。与普通队列不同的是&#xff0c;它支持两个附加操作&#xff0c;即阻塞添加和阻塞删除方法。如上图&#xff0c;线程1往…

2023年值得参加的数学建模竞赛介绍

数学建模竞赛&#xff1a;一次参与&#xff0c;终身受益 博主7年数学建模竞赛经验&#xff0c;历史获奖率百分之百。团队成员都是拿过全国一等奖的硕博&#xff0c;有需要数模竞赛帮助的可以私信我。 有同学咨询还有那些数学建模比赛可以参加&#xff0c;哪些含金量比较高&…

Qt图片定时滚动播放器+透明过渡动画

目录参考结构PicturePlay.promain.cppmyqlabel.h 自定义QLabelmyqlabel.cpp自定义QLabelpictureplay.hpictureplay.cpppictureplay.uistyle.qss效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 Qt的动画类修改…

3 决策树及Python实现

1 主要思想 1.1 数据 1.2 训练和使用模型 训练&#xff1a;建立模型&#xff08;树&#xff09; 测试&#xff1a;使用模型&#xff08;树&#xff09; Weka演示ID3&#xff08;终端用户模式&#xff09; 双击weka.jar选择Explorer载入weather.arff选择trees–>ID3构建树…

简单易懂又非常牛逼的Spring源码解析,推断构造与bean的实例化

简单易懂又非常牛逼的Spring源码解析&#xff0c;推断构造与bean的实例化原理解析实例化bean的入口工厂方法实例化推断构造初次筛选二次筛选bean的实例化代码走读实例化bean的入口createBeanInstance方法内部的流程推断构造初次筛选二次筛选bean的实例化总结往期文章&#xff1…

十六、vue3.0之富文本编辑器的选择

在工作过程中我们会遇到很多的时候会使用到富文本编辑器,市场上流行的也是各种各样的,那么究竟如何选择呢,今天就给大家讲讲有哪一些,方便大家的选择。 一、TinyMCE TinyMCE 是富文本编辑器领域的头部玩家之一,主流富文本编辑器,功能非常全,你需要的大多数功能它都支持…

深力科电子-MachXO3系列 LCMXO3LF-1300C-5BG256C 控制和桥接FPGA器件

深力科电子-lattice莱迪斯MachXO3系列 LCMXO3LF-1300C-5BG256C 控制和桥接FPGA器件 &#xff0c;FPGA 现场可编程逻辑器件,小尺寸&#xff0c;高性能&#xff01;在工业领域&#xff0c;它可以用于网络控制器&#xff0c;PLC,网络边缘计算&#xff0c;机器视觉和工业机器人&…

万字解析 Linux 中 CPU 利用率是如何算出来的?

在线上服务器观察线上服务运行状态的时候&#xff0c;绝大多数人都是喜欢先用 top 命令看看当前系统的整体 cpu 利用率。例如&#xff0c;随手拿来的一台机器&#xff0c;top 命令显示的利用率信息如下 这个输出结果说简单也简单&#xff0c;说复杂也不是那么容易就能全部搞明白…

【java web篇】使用JDBC操作数据库

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

学习Java前,应该了解的这些知识(新手必学)

Java语言广泛应用于编写web应用程序、移动开发、安卓开发等&#xff0c;市场上对Java人才需求量很大&#xff0c;有数据显示&#xff0c;Java工程师的薪资待遇随着人才市场的需求逐步递增&#xff0c;由此可见&#xff0c;Java人才需求量呈现持续上升趋势&#xff0c;供不应求。…

LevelDB架构介绍以及读、写和压缩流程

LevelDB 基本介绍 是一个key/value存储&#xff0c;key值根据用户指定的comparator排序。 特性 keys 和 values 是任意的字节数组。数据按 key 值排序存储。调用者可以提供一个自定义的比较函数来重写排序顺序。提供基本的 Put(key,value)&#xff0c;Get(key)&#xff0c;…

企业电子招标采购源码之电子招标投标全流程!

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

13-mvc框架原理与实现方式

1、mvc原理 # mvc 与框架## 1.mvc 是什么1. m:model,模型(即数据来源),主要是针对数据库操作 2. v:view,视图,html 页面。视图由一个一个模板构成(模板是视图的一个具体展现或载体,视图是模板的一个抽象) 3. c:controller,控制器,用于mv之间的数据交互## 2.最简单的 mvc 就是一…

Java+Swing+Mysql实现超市管理系统

一、系统介绍1.开发环境操作系统&#xff1a;Win10开发工具 &#xff1a;IDEA2018JDK版本&#xff1a;jdk1.8数据库&#xff1a;Mysql8.02.技术选型JavaSwingMysql3.功能模块4.系统功能1.系统登录登出管理员可以登录、退出系统2.商品信息管理管理员可以对商品信息进行查询、添加…

MapReduce小试牛刀

部署完hadoop单机版后&#xff0c;试下mapreduce是怎么分析处理数据的 Word Count Word Count 就是"词语统计"&#xff0c;这是 MapReduce 工作程序中最经典的一种。它的主要任务是对一个文本文件中的词语作归纳统计&#xff0c;统计出每个出现过的词语一共出现的次…

【云原生kubernetes】k8s 常用调度策略使用详解

一、前言 通过之前的学习&#xff0c;我们了解到k8s集群中最小工作单位是pod&#xff0c;对于k8s集群来说&#xff0c;一个pod的完整生命周期是由一系列调度策略来控制&#xff0c;这些调度策略具体是怎么工作的呢&#xff1f;本文将详细讨论下这个问题。 二、k8s调度策略简介…

K8S---Pod进阶资源限制以及探针

目录 一、Pod 进阶 1、资源限制 2、Pod 和 容器 的资源请求和限制&#xff1a; 3、CPU 资源单位 4、内存 资源单位 5、实例操作 5.1 示例1 5.2 示例2 6、重启策略&#xff08;restartPolicy&#xff09; 6.1 示例1 二、健康检查&#xff1a;又称为探针&#xff08;P…

华为OD机试题,用 Java 解【机器人走迷宫】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

电动针阀流量控制和电气比例阀压力控制在液氮低温控制中的应用

摘要&#xff1a;为了解决室温至液氮温区温控系统中需要昂贵的低温电动阀门进行液氮介质流量调节的问题&#xff0c;本文提供了三种不同精度的液氮温区内的低温温度控制解决方案。解决方案的技术核心是通过采用电动针阀和电气比例阀在室温环境下来快速调节外部气源流量或压力大…

Nginx网站服务——编译安装、基于授权和客户端访问控制

文章目录一、Nginx概述1.1、Nginx的特点1.2、Nginx编译安装1.3、Nginx运行控制1.4、Nginx和Apache的区别二、编译安装Nginx服务的操作步骤2.1、关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下2.2、安装依赖包2.3、创建运行用户、组&#xff08;Nginx 服务程序默认…