【JavaEE进阶】实现验证码

简介: 【JavaEE进阶】实现验证码


🌲实现说明

随着安全性的要求越来越⾼,⽬前项⽬中很多都使⽤了验证码,验证码的形式也是多种多样,更复杂的图形验证码和⾏为验证码已经成为了更流⾏的趋势.

验证码的实现⽅式很多,⽹上也有⽐较多的插件或者⼯具包可以使⽤,这里博主选择使⽤Google的开源项⽬Kaptcha来实现.

🍃Kaptcha插件介绍

Kaptcha是Google的⼀个⾼度可配置的实⽤验证码⽣成⼯具.代码: 代码链接

⽹上有很多⼈甚⾄公司基于Google的kaptcha进⾏了⼆次开发.我们选择⼀个直接适配SpringBoot的开源项⽬:项目地址

下⾯简单介绍下插件的使⽤

🚩插件原理

验证码可以客⼾端⽣成,也可以服务器⽣成.对于普通的字符验证码,后端通常分两部分.

  • ⼀是⽣成验证码内容,根据验证码内容和⼲扰项等,⽣成图⽚,返回给客⼾端
  • ⼆是把验证码内容存储起来,校验时取出来进⾏对⽐.

kaptcha插件选择把验证码存储在Session⾥

🚩引入依赖

想要使用该插件,我们需要引入以下依赖

<dependency>
  <groupId>com.oopsguy.kaptcha</groupId>
  <artifactId>kaptcha-spring-boot-starter</artifactId>
  <version>1.0.0-beta-2</version>
</dependency>

🚩⽣成验证码

该插件提供了两种⽅式⽣成验证码

  • 通过代码来⽣成( 参考文档 不再介绍)
  • 仅通过配置⽂件来⽣成验证码(推荐)

博主这里实现也是使用验证码进行实现

🚩Kaptcha详细配置

关于Kaptcha详细配置如下表所示:

配置项 配置说明 默认值
kaptcha.border 图⽚边框,合法值:yes,no yes
kaptcha.border.color 边框颜⾊,合法值:r,g,b(and optionalalpha)或者white,black,blue. black
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 字体颜⾊,合法值:r,g,b或者white,black,blue. black
kaptcha.textproducer.char.space ⽂字间隔 2
kaptcha.noise.impl ⼲扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color ⼲扰颜⾊,合法值:r,g,b或者white,black,blue. black
kaptcha.obscurificator.impl 图⽚样式:⽔纹com.google.code.kaptcha.impl.WaterRipple⻥眼com.google.code.kaptcha.impl.FishEyeGimpy阴影com.google.code.kaptcha.impl.ShadowGimpy 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 key KAPTCHA_SESSION_KEY
kaptcha.session.date session date KAPTCHA_SESSION_DATE

使⽤ kaptcha.items可以 配置多个验证码⽣成器

kaptcha.items 是⼀个Map,key为验证码⽣成器名称,value为验证码⽣成器的配置

kaptcha:
 items:
  home:
   path: /home/captcha
   session:
    key: KAPTCHA_SESSION_KEY
    date: KAPTCHA_SESSION_DATE

配置后,可以直接访问http://XXXX:port/home/captcha即可⽣成验证码

了解了该插件后,我们来开始做项目

🍀准备⼯作

创建项⽬,引⼊SpringMVC的依赖包,把前端⻚⾯放在项⽬中(这里博主直接给出)

index.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>验证码</title>
  <style>
    #inputCaptcha {
      height: 30px;
      vertical-align: middle; 
    }
    #verificationCodeImg{
      vertical-align: middle; 
    }
    #checkCaptcha{
      height: 40px;
      width: 100px;
    }
  </style>
</head>
<body>
  <h1>输入验证码</h1>
  <div id="confirm">
    <input type="text" name="inputCaptcha" id="inputCaptcha">
    <img id="verificationCodeImg" src="/admin/captcha" style="cursor: pointer;" title="看不清?换一张" />
    <input type="button" value="提交" id="checkCaptcha">
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    
    $("#verificationCodeImg").click(function(){
      $(this).hide().attr('src', '/admin/captcha?dt=' + new Date().getTime()).fadeIn();
    });
    $("#checkCaptcha").click(function () {
      $.ajax({
        url: "/admin/check",
        type: "get",
        data: { captcha: $("#inputCaptcha").val() },
        success: function (result) {
          if (result) {
            location.href = "success.html";
          } else {
            alert("验证码错误");
            $("#inputCaptcha").val("");
          }
        }
      });
    });
  </script>
</body>
</html>

success.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>验证成功页</title>
</head>
<body>
    <h1>验证成功</h1>
</body>
</html>

🌴约定前后端交互接⼝

🚩需求分析

界⾯如下图所⽰

  1. ⻚⾯⽣成验证码
  2. 输⼊验证码,点击提交,验证⽤⼾输⼊验证码是否正确,正确则进⾏⻚⾯跳转


后端需要提供两个服务

  1. ⽣成验证码,并返回验证码
  2. 校验验证码是否正确:校验验证码是否正确

🚩接⼝定义

接口一:⽣成验证码

请求:

GET /admin/captcha

响应:图片内容

浏览器给服务器发送⼀个 GET /admin/captcha 这样的请求,服务器返回⼀个图⽚,浏览器显⽰在⻚⾯上

接口二:校验验证码是否正确

请求:/admin/check

POST /admin/check

captcha=xn8d

captcha:⽤⼾输⼊的验证码

响应:

true

根据⽤⼾输⼊的验证码,校验验证码是否正确true:验证成功.false:验证失败

🚩实现服务器后端代码

我们分为三步完成

第一步引入依赖,上面已讲过了,直接引入就好

第二步通过配置创建验证码⽣成器

配置如下:

kaptcha:
 image:
  width: 200
  height: 50
 textproducer:
  font:
   size: 40
 items:
  home:
   path: /admin/captcha
   session:
    key: KAPTCHA_SESSION_KEY
    date: KAPTCHA_SESSION_DATE

第三步,验证码校验

这里我们需要根据前端传回来的验证码与服务器session中取得值做一个比对

除此之外我还添加了验证码为null时,返回false。以及一个验证码得时效性,当超过一定时间,该验证码就不能够再进行验证了,返回false

代码实现如下:

@RequestMapping("/admin")
@RestController
public class KaptchaController {
    //设置时间问60s
    private final static long VALID_MILLIS_TIME = 60 * 1000;
    @RequestMapping("/check")
    public boolean checkHomeCaptcha(String captcha, HttpSession session) {
        if (!StringUtils.hasLength(captcha)) {
            return false;
        }
        //获取验证码
        String savedCaptcha = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        //获取验证生成时间
        Date sessionDate = (Date) session.getAttribute(Constants.KAPTCHA_SESSION_DATE);
        if (captcha.equalsIgnoreCase(savedCaptcha)) {
            if (sessionDate == null || System.currentTimeMillis() - sessionDate.getTime() < VALID_MILLIS_TIME)
                return true;
        }
        return false;
    }
}

注意事项:

⭕总结

关于《【JavaEE进阶】实现验证码》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章
|
NoSQL Java Redis
Springboot从2.x升级到3.x以后redis默认配置调整
Springboot从2.x升级到3.x以后redis默认配置调整
1562 0
|
8月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
2504 1
|
8月前
|
人工智能 监控 Shell
通过 Cursor CLI 使用 GPT-5 的教程
Cursor CLI 是一款轻量级命令行工具,让开发者在终端中直接调用 GPT-5,实现代码生成、文本处理和快速查询,无需切换环境。它支持 Shell 脚本集成,适用于自动化任务,如代码注释生成、日志分析等。本文详解其安装配置、核心功能与高效使用技巧,助你提升开发效率。
|
9月前
|
存储 人工智能 关系型数据库
从“听指令”到“当参谋”,阿里云AnalyticDB GraphRAG如何让AI开窍
阿里云瑶池旗下的云原生数据仓库 AnalyticDB PostgreSQL 版 GraphRAG 技术,创新融合知识图谱动态推理+向量语义检索,通过实体关系映射与多跳路径优化,构建可应对复杂场景的决策引擎。本文将通过家电故障诊断和医疗预问诊两大高价值场景,解析其如何实现从“被动应答”到“主动决策”的跨越。
|
存储 Linux Go
如何在Github上Pull Request的教程
关于如何在GitHub上发起Pull Request(合并请求)的详细教程,包括Fork(分支)、Clone(克隆)、创建新分支、修改代码、提交更改、推送到远程仓库等步骤,并提供了解决权限问题的方法,如创建个人访问令牌(Personal Access Token)。
884 6
|
Unix Docker 容器
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker
2237 0
|
传感器 数据可视化 机器人
【ROS速成】半小时入门机器人ROS系统简明教程之可视化系统(三)
半小时入门机器人ROS系统简明教程之可视化系统
1098 0
|
算法 数据可视化 机器人
ROS2教程01 ROS2介绍
本文是ROS2(机器人操作系统的下一代)的介绍教程,内容包括ROS2的诞生背景、核心功能、特点、框架以及与ROS1的比较。文章涵盖了ROS2的通信系统、框架和工具、生态系统、全球性社区支持、完全开源、跨平台特性、多机协同能力、实时系统支持和更强的稳定性。此外,还提供了ROS2架构的详细介绍资源链接,适合对ROS2感兴趣的读者学习和了解。
3310 1
|
缓存 Kubernetes Java
在K8S中,如何排查与解决Pod出现OOM的问题?
在K8S中,如何排查与解决Pod出现OOM的问题?
|
NoSQL Redis
RedisTemplate.opsForSet()用法简介并举例
RedisTemplate.opsForSet()用法简介并举例
1656 2

热门文章

最新文章