《JavaEE进阶》----14.<SpringMVC配置文件实践之【验证码项目】>

本篇博客介绍的是Google的开源项目Kaptcha来实现的验证码。

这种是最简单的验证码。

也是很常见的一种验证码。可以去看项目结果展示。就可以明白这个项目了。

前言:

随着安全性的要求越来越高、很多项目都使用了验证码。如今验证码的形式也是有许许多多、更复杂的图形验证码和行为验证码已经成为了更流行的趋势.

验证码的实现方式有很多,网上也有比较多的插件或者工具包可以使用。

本篇博客介绍的是Google的开源项目Kaptcha来实现的。

上图就是我们要做的验证码示例:

验证码 = 验证码 + 背景图片 + 干扰项 

验证码前后端都可以做。

验证码的原理并不复杂。

项目需求:

首先我们来了解一下本篇讲解的验证码是什么样的。能达到什么效果。

1.页面生成验证码

2.输入验证码、点击提交、验证用户输入验证码是否正确、正确则进行页面跳转。不正确则继续刷新验证码、重新输入。

一、Kaptcha插件介绍

Kapycha 是Google的一个高度可配置的实用验证码生成工具。

1.1 验证码原理

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

一是生成验证码内容,根据验证码内容和干扰项等生成图片,返回给客户端。

二是把验证码内容存储起来。校验时取出来进行对比。

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

1.2引入依赖

首先我们要引入依赖,相当于下载好这个插件。

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

1.3生成验证码

这个插件提供了两种方式生成验证码

1.通过代码来生成(不具体说了)

2.仅通过配置文件来生成验证码(推荐使用)

Kaptcha详细配置(简单了解一下即可)

 

也可以使用Kaptcha.items配置多个验证码生成器。

Kaptcha.items是一个Map

key为验证码生成器名称、value为验证码生成器的配置

下面是我们在yml的类型的配置文件中的配置。这里简单示例一下:

#配置Kaptcha验证码
kaptcha:
  items:
  # home captcha
    home:
      path: /home/captcha
      session:
        key: HOME_KAPTCHA_SESSION_KEY
        date: HOME_KAPTCHA_SESSION_DATE
  # admin captcha
    admin:
      path: /admin/captcha
      session:
        key: ADMIN_KAPTCHA_SESSION_KEY
        date: ADMIN_KAPTCHA_SESSION_DATE

 配置说明:

home:生成器名称

path:生成器访问路径

session:

        key:

        date:

这三个是生成验证码存储中Session中的key

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

如我的访问路径就是

http://127.0.0.1:1208/home/captcha

http://127.0.0.1:1208/admin/captcha

两个都可以。

当刷新浏览器,就会刷新出新的验证码。

显然我们只是能够显示出验证码。那么我们如何让验证码为我们所用。达到验证的目的呢

类似于这样。这就是我们接下来要做的工作了。

二、配合Spring MVC来使用验证码

1.创建项目,引入SpringMVC的依赖包。

2.引入kapycha依赖。相当于下载,载入这个插件

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

3.使用yml配置文件 生成验证码

kaptcha: 
  border:
    enbaled: true
  image:
    height: 50
    width: 160
  text-producer:
    character:
      length: 4
    font:
      color: blue
  items:
    admin:
      path: /admin/captcha
      session:
        key: KAPTCHA_SESSION_KEY
        date: KAPTCHA_SESSION_DATE

生成的验证码效果如图所示: 

在项目中放入前端代码:前端需要约定前后端交互接口。

2.1前端代码

1.进行前端页面展示

2.约定前后端交互接口。

<!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="captcha" 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("验证码校验错误!");
            }
          },
        });
      });
    </script>
  </body>
</html>

前后端交互的代码:

    <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("验证码校验错误!");
            }
          },
        });
      });
    </script>

 

前端页面展示:

2.2后端代码

后端工作

1.生成验证码、并返回验证码

2.校验验证码是否正确。

2.2.1定义生成验证码的接口

通过get请求:/admin/captcha路径

响应图片内容。

2.2.2 校验验证码是否正确的接口

请求:/admin/check

captcha :用户输入的验证码等于图片中的验证码

响应:true/false

@RequestMapping("/admin")
@RestController
public class KaptchaController {
    private static final String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";
    private static final String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";
    private static final long TIME_OUT = 60 * 1000; //一分钟/毫秒数

    @RequestMapping("/check")
    public boolean check(String captcha, HttpSession session){
        //判断输入的验证码是否为空
        if(!StringUtils.hasLength(captcha)){
            return false;
        }
        //获取生成的验证码
        String savedCaptcha = (String) session.getAttribute(KAPTCHA_SESSION_KEY);
        Date savedCaptchaData = (Date) session.getAttribute(KAPTCHA_SESSION_DATE);
        System.out.println(savedCaptcha);

        if(captcha.equalsIgnoreCase(savedCaptcha)){//不区分验证码的大小写进行比对
            //savedCaptchaData != null
            //在 Session 中不存在或尚未存储时,尝试读取它的值会导致空指针异常,程序会中断。
            //在后续的时间计算逻辑中可能会出现错误。...
            if(savedCaptchaData != null && System.currentTimeMillis()-savedCaptchaData.getTime() < TIME_OUT ){
                return true;
            }
        }
        return false;
    }

}

项目结果展示:

1.进入验证页面

2.输入验证码并提交,成功跳转页面到成功页面

 

3.验证码输入错误时,弹窗提示。当验证码生成后1分钟验证码会失效。此时也会弹窗报错。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread Nano版本在STM32F103RB上的快速移植

目录 概述 1 RT-Thread Nano 1.1 Nano版本介绍 1.2 RT-Thread Nano的特点 2 STM32Cube 创建工程 2.1 STM32Cub配置板卡参数 2.2 项目程序架构 3 移植RT-Thread 3.1 Keil IDE加载RT-Thread 3.2 解决上面两个ERROR 3.2.1 ERROR-1: 3.2.2 ERROR-2 3.3 移植FINSH 3.4…

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…

LSP协议:打造流动性管理的市场新标杆

随着以太坊从 PoW&#xff08;工作量证明&#xff09;向 PoS&#xff08;权益证明&#xff09;的转型&#xff0c;PoS已然成为主流区块链共识机制的重要组成部分。再加上跨链技术的发展&#xff0c;包含比特币在内的不同生态之间进行资产质押与交换也催生出市场对于流动性管理的…

基于RP2350 MCU的树莓派Pico 2开发板及MicroPython编程使用

2021年1月21日,树莓派基金会同时发布了第1代RP2040 MCU芯片和基于RP2040 MCU的第1代树莓派Pico开发板(Raspberry Pi Pico/ Raspberry Pi Pico 1)。2024年8月8日,树莓派基金会又发布了第2代RP2350 MCU芯片并推出了基于RP2350 MCU的第2代树莓派Pico开发板(Raspberry Pi Pico 2)…

英文外链代发服务靠谱吗?

英文外链代发服务的可靠性因供应商和服务类型而异。外链代发服务的主要目标是提高网站在搜索引擎中的排名&#xff0c;通过增加指向目标网站的链接数量和质量来实现。然而&#xff0c;并不是所有的外链代发服务都是可靠的&#xff0c;很多外链都是只管发&#xff0c;但是发了有…

驾校预约学习系统的设计与实现

摘 要 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进到…

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习&#xff1a;参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归&#xff08;SAheart.csv&#xff09; 【学习笔记】 陈强-机器学习-Python-…

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染&#xff1a;一项综述 文章目录 大规模语言模型的基准数据污染&#xff1a;一项综述摘要1 引言 摘要 大规模语言模型&#xff08;LLMs&…

海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型

海洋运输船5G智能工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。在当今全球制造业的浪潮中&#xff0c;数字化转型已成为不可逆转的趋势&#xff0c;它不仅重塑了生产流程&#xff0c;更深刻影响着企业的竞争力与可持续发展能力。其中&#xff0c;海洋运输船5G智能工…

LabVIEW中Request Deallocation 功能

此功能会在包含该功能的 VI 运行之后释放未使用的内存。 该功能仅适用于高级性能优化。在某些情况下&#xff0c;释放未使用的内存可以提高性能。然而&#xff0c;过于频繁地释放内存可能导致 LabVIEW 反复重新分配空间&#xff0c;而不是重用已有的内存分配。如果您的 VI 分配…

怎么修复松下相机死机视频只有0字节(0KB)的MDT文件【实测可修复】

死机后视频文件大小仅为0字节 松下S5相机录像死机&#xff0c;关机重新开机后有一个视频文件变成MDT&#xff0c;大小为0KB&#xff0c;录了30多分钟&#xff0c;本应为MOV格式的视频。0字节文件可以修复吗&#xff1f;怎么修复0字节的MDT文件为视频&#xff1f; 数据提取与视…

建造者模式builder

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/builder 能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象

Centos7.9 安装Elasticsearch 8.15.1(图文教程)

本章教程,主要记录在Centos7.9 安装Elasticsearch 8.15.1的整个安装过程。 一、下载安装包 下载地址: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-15-1 你可以通过手动下载然后上传到服务器,也可以直接使用在线下载的方式。 wget https://artifacts…

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景 "板凳龙"&#xff0c;又称"盘龙"&#xff0c;是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色&#xff0c;展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中&am…

如何正确选择防逆流监测多功能仪表?

安科瑞戴婷 什么是防回流&#xff1f; 什么是“逆流”&#xff1f;在电力系统中&#xff0c;电力通常从电网输送到负载&#xff0c;称为正向电流。安装光伏电站后&#xff0c;当光伏系统的功率大于本地负载的功率时&#xff0c;无法消耗的功率将被送至电网。由于电流方向与传…

【算法思想·二叉树】序列化

本文参考labuladong算法笔记[二叉树心法&#xff08;序列化篇&#xff09; | labuladong 的算法笔记] 要说序列化和反序列化&#xff0c;得先从 JSON 数据格式说起。 JSON 的运用非常广泛&#xff0c;比如我们经常将编程语言中的结构体序列化成 JSON 字符串&#xff0c;存入缓…

Unity面向对象补全计划 之 List<T>与class(非基础)

C# & Unity 面向对象补全计划 泛型-CSDN博客 关于List&#xff0c;其本质就是C#封装好的一个数组&#xff0c;是一个很好用的轮子&#xff0c;所以并不需要什么特别说明 问题描述 假设我们有一个表示学生的类 Student&#xff0c;每个学生有姓名和年龄两个属性。我们需要创…

MFC工控项目实例之十二板卡测试信号输出界面

承接专栏《MFC工控项目实例之十一板卡测试信号输入界面》 1、在BoardTest.h文件中添加代码 CButtonST m_btnStart[16],m_btnStart_O[16];2、在BoardTest.cpp文件中添加代码 UINT No_IDC_CHECK_O[16] {IDC_CHECK16,IDC_CHECK17,IDC_CHECK18,IDC_CHECK19,IDC_CHECK20,IDC_CH…

Apache Guacamole 安装及配置VNC远程桌面控制

文章目录 官网简介支持多种协议无插件浏览器访问配置和管理应用场景 Podman 部署 Apache Guacamole拉取 docker 镜像docker-compose.yml部署 PostgreSQL生成 initdb.sql 脚本部署 guacamole Guacamole 基本用法配置 VNC 连接 Mac 电脑开启自带的 VNC 服务 官网 https://guacam…

华为防火墙 nat64

如果设备接收到的IPv6报文的前缀是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv4网络&#xff0c;报文将经过NAT64处理后被转发至IPv4网络。 如果设备接收到的IPv6报文的前缀不是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv6网络&#xff0c;报文…