如何在项目中实现登录时的验证码校验功能?

news2025/1/15 17:20:12

如何在项目中实现登录时的验证码校验功能?

  • 第一步:创建项目,添加依赖
  • 第二步:验证码配置(CaptchaConfig类)
  • 第三步:创建CaptchaController
  • 第四步:测试
  • 注意问题

  • 这里介绍一款老牌的验证码工具kaptcha
  • github链接: https://github.com/penggle/kaptcha
  • 下面用一个简单的例子讲解一下使用步骤:

第一步:创建项目,添加依赖

在这里插入图片描述

<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>

第二步:验证码配置(CaptchaConfig类)

  • 提供了两个Bean,一个是字符串匹配验证码,一个是数学计算验证码,这里以字符串方式演示:
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;
import static com.google.code.kaptcha.Constants.*;

@Configuration
public class CaptchaConfig {
    
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 验证码文本字符颜色 默认为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");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_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 = "captchaProducerMath")
    public DefaultKaptcha getKaptchaBeanMath() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 边框颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
        // 验证码图片宽度 默认为200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // 验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
        // 验证码文本生成器
        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.kun.valiant.framework.config.KaptchaTextCreator");
        // 验证码文本字符间距 默认为2
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
        // 验证码文本字符长度 默认为5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // 验证码噪点颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
        // 干扰实现类
        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        // 图片样式 水纹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;
    }*/
}

第三步:创建CaptchaController

@RestController
public class CaptchaController {

    @Autowired
    DefaultKaptcha defaultKaptcha;

    @GetMapping("/textCaptcha")
    public void textCaptcha(HttpServletResponse resp) throws IOException {
        //生成验证码文本
        String text = defaultKaptcha.createText();
        //基于文本生成图片对象
        BufferedImage image = defaultKaptcha.createImage(text);
        //写到前端
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }

	@GetMapping("/hello")
    public void hello(HttpSession session){
        System.out.println("session.getAttribute.kaptchaCode : " + session.getAttribute("kaptchaCode"));
    }
}

第四步:测试

  • 访问:http://localhost:8086/textCaptcha,获得验证码
    在这里插入图片描述

注意问题

  • 配置中有这么一行
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
  • 意思是自动将验证码文本存入 session 中
  • 但是我们测试接口:http://localhost:8086/hello,发现 session 是空的
    在这里插入图片描述
  • 因为他自己其实是提供有一个 Servlet ,我们自己写 controller 这个配置是不生效的,想要它生效,配置文件就不能上边那样写了
@Bean
    ServletRegistrationBean<HttpServlet> captchaServlet(){
        ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>();
        bean.setServlet(new KaptchaServlet());
        bean.addUrlMappings("/test2");
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 验证码文本字符颜色 默认为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");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_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");
        bean.setInitParameters(new HashMap<>((Map)properties));
        return bean;
    }
  • 配置文件改成这样,就可以用了(注意注释掉自己controller的测试接口)
    源码链接

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

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

相关文章

使用@Resource注解和@Inject注解

1.Resource和Inject概述 1.1.Resource注解 Resource注解是Java规范里面的&#xff0c;也可以说它是JSR250规范里面定义的一个注解。该注解默认按照名称进行装配&#xff0c;名称可以通过name属性进行指定&#xff0c;如果没有指定name属性&#xff0c;当注解写在字段上时&…

KCC南京成立会议如期举办

1915年9月15日&#xff0c;陈独秀等人在上海创立了《新青年》杂志&#xff0c;掀起了中华新文化思潮。接着&#xff0c;在1919年5月4日&#xff0c;陈独秀、李大钊等人发起了五四运动&#xff0c;唤醒了沉睡多年的东方巨狮。从此&#xff0c;五四青年节便成为了青年人的节日。 …

上市后首份财报,紫燕食品去年净利下降超3成

近日&#xff0c;上海紫燕食品股份有限公司&#xff08;下称“紫燕食品”,603517.SH&#xff09;交出了上市后的首份年报。 去年9月26日&#xff0c;紫燕食品在上交所主板上市&#xff0c;成为继绝味食品&#xff08;603517.SH&#xff09;、周黑鸭&#xff08;01458.HK&#…

Jetpack Compose 中的Deep Linking — Android

Jetpack Compose 中的Deep Linking — Android 在本文中&#xff0c;我们将学习如何在 Jetpack Compose 中轻松实现深度链接。 什么是深度链接&#xff1f; 深层链接允许用户直接从外部来源&#xff08;例如网站或其他应用程序&#xff09;导航到应用程序内的特定内容。 添…

联想笔记本系统更新中断后变成蓝屏怎么U盘重装系统?

联想笔记本系统更新中断后变成蓝屏怎么U盘重装系统&#xff1f;有用户使用的联想笔记本电脑在系统更新的过程中&#xff0c;因为自己进行了一些操作&#xff0c;导致系统更新中断了&#xff0c;重启系统之后变成了蓝屏的情况。那么这个时候怎么去通过U盘重装系统来恢复电脑使用…

2d游戏人物动作实现(C语言)

没有接触制作小游戏前&#xff0c;感觉做游戏很不可思议&#xff0c;游戏里的人物是怎么移动的&#xff0c;怎么攻击&#xff0c;释放技能。。。。。。现在逐渐了解到之后&#xff0c;发现2d游戏人物的动作更多是图片的拼接&#xff0c;动作是否精细&#xff0c;由这个动作的帧…

第四十二章 Unity 下拉框 (Dropdown) UI

本章节我们介绍下拉框 (Dropdown)&#xff0c;我们点击菜单栏“GameObject”->“UI”->“Dropdown”&#xff0c;然后调整它的位置&#xff0c;效果如下 其实它的本质就是一个下拉列表&#xff0c;然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…

asp.net+sqlserver学生学籍管理系统

1.系统登录模块&#xff1a;为了保证系统的安全性和保密性&#xff0c;便于用户的管理&#xff0c;对用户设置权限。 界面上需要输入用户名、密码、验证码以及用户类型。 用户类型&#xff1a;普通用户和管理员用户。 2.用户信息管理模块&…

Solr(4):Solr索引库说明及创建

1 索引库概述 索引库类似于mysql的数据库&#xff0c;所以如果要使用Solr必须创建一个索引库才能使用 2 使用solr管理页面去创建【不推荐】 2.1 打开solr的管理页面 2.2 点击add Core name&#xff1a;自定义名字 建议和instanceDir目录保持一样instanceDir&#xff1a;实例名…

两大巨头强强联手,为亿万旅行者提供完美旅程

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 这个“五一”你买到票了么&#xff1f; 今年五一火爆程度可谓“盛况空前”&#xff0c;4月28号&#xff08;放假前一天&#xff09;上海单日通往全国所有车站的车票售罄&#xff0c;这是115年以来首次出现这种情况。不仅是上…

javaScript---设计模式-提高复用性

目录 1、提高复用性的设计模式 2、基本结构与应用示例 2.1 享元模式 2.2 桥接模式 2.3 模板方法模式 2.4 JS的组合与继承 提高复用性的目的&#xff1a;①遵循DRY&#xff08;Dont Repeat Yourself&#xff09;原则&#xff1b;②减少代码量&#xff0c;节省开销 什么是好的复用…

Android安装apk出现 “安装包无效”或“安装包不兼容”的解决方案

Android 安装apk出现“安装包无效”或“安装包不兼容”解决方案 1. 问题出现2. 配置 build.gradle3. 生成Signed APK 1. 问题出现 使用Android Studio安装apk到手机一切正常&#xff0c;但是分享出去出现安装apk出现“安装包无效”或“安装包不兼容”问题 这种情况需要我们设…

MySQL之从一条记录说起 【InnoDB 记录结构下篇】

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》 上一篇文章讲了InnoDB有Compact、Redundant、Dynamic、Compressed4种⾏格式&#xff0c;其中主要讲了Com…

Java——按之字形顺序打印二叉树

题目链接 牛客在线oj题——按之字形顺序打印二叉树 题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 数据范围&#xff1a;0≤n≤1500, 树上每个…

深入浅出字符编码

本文对应视频链接&#xff1a; 深入浅出字符编码 什么是编码格式 从一个小问题引入 我们在学习C语言的时候&#xff0c;有一道必做的题目是将大写字母转换成小写&#xff0c;相信有点基础的同学都能不加思索的写出下面的代码&#xff1a; char toLower(char upper){if (up…

大数据Doris(十四):数据模型的选择建议和列定义建议

文章目录 数据模型的选择建议和列定义建议 一、数据模型的选择建议 1、Aggregate数据模型选择<

如何快速给出解释——正交矩阵子矩阵的特征值的模必然不大于1

Memory 首先快速回忆一下正交矩阵的定义&#xff1a; A为n阶实矩阵&#xff0c;且满足A‘AE或是说AA’E&#xff0c;那么A为正交矩阵。 &#xff08;啊&#xff0c;多么简洁的定义&#xff09; 其次快速想到它的性质&#xff1a; ① 实特征值必然 或 其他复数…

qt几种常见安装包制作工具-Qt Installer Framework

Qt Installer Framework&#xff08;简称&#xff1a;QtIFW&#xff09;概述 QtIFW提供了一组工具和实用程序&#xff0c;可以一次性创建安装程序&#xff0c;并在所有支持的桌面Qt平台上部署它们&#xff0c;而无需重写源代码。安装程序将在运行它们的平台上具有本机外观和感…

第四节 特殊权限SUID、SGID、SBIT

1.Set UID 简称 SUID 简称 SUID 限制与功能&#xff1a; SUID权限仅对二进制程序有效&#xff1b; 执行者对于该程序需要具有x的执行权限&#xff1b; 本权限仅在执行该程序的过程中有效&#xff1b;  执行者将具有该程序拥有者的权限 特殊权限SUID、SGID、SBIT 例&am…

【分布族谱】Zipf分布及其Python可视化

文章目录 zipf分布简介zipfian和zipf对象zipf分布到zeta分布的变化情况分布族谱图 zipf分布简介 #mermaid-svg-mG901pJXpTYFT7Bk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mG901pJXpTYFT7Bk .error-icon{fill:…