【项目功能模块】SpringBoot+vue实现登录图片验证码

2023-11-13

SpringBoot+vue实现登录图片验证码

要在Spring Boot和Vue中实现登录时的图片验证码功能,可以按照以下步骤进行操作:
后端(Spring Boot)实现:
添加相关依赖:在
pom.xml文件中添加以下依赖:

<dependency>
    <groupId>nl.captcha</groupId>
    <artifactId>simplecaptcha</artifactId>
    <version>1.2.2</version>
</dependency>

创建一个验证码生成器:创建一个CaptchaGenerator类,用于生成验证码图片。

import nl.captcha.Captcha;
import nl.captcha.backgrounds.FlatColorBackgroundProducer;
import nl.captcha.gimpy.DropShadowGimpyRenderer;
import nl.captcha.text.producer.DefaultTextProducer;
import nl.captcha.text.renderer.DefaultWordRenderer;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

@Component
public class CaptchaGenerator {

    public byte[] generateCaptchaImage(String captchaText) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        
        // 创建验证码图片对象
        Captcha captcha = new Captcha.Builder(200, 50)
                .addText(new DefaultTextProducer(), new DefaultWordRenderer())
                .gimp(new DropShadowGimpyRenderer())
                .addBackground(new FlatColorBackgroundProducer(Color.WHITE))
                .build();

        try {
            // 将验证码图片写入输出流
            ImageIO.write(captcha.getImage(), "png", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return outputStream.toByteArray();
    }
}

创建一个REST API接口:创建一个
CaptchaController类,用于生成验证码图片的API接口。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
@RequestMapping("/api/captcha")
public class CaptchaController {

    private final CaptchaGenerator captchaGenerator;

    @Autowired
    public CaptchaController(CaptchaGenerator captchaGenerator) {
        this.captchaGenerator = captchaGenerator;
    }

    @GetMapping
    public void generateCaptcha(HttpServletResponse response) throws IOException {
        // 生成验证码图片的方法
        byte[] captchaImage = captchaGenerator.generateCaptchaImage("1234");
        
        // 设置响应的内容类型为图片
        response.setContentType("image/png");
        
        // 将验证码图片写入响应输出流
        response.getOutputStream().write(captchaImage);
    }
}

启动应用程序:启动Spring Boot应用程序,确保REST API接口可用。
前端(Vue)实现:
创建一个验证码组件:创建一个Captcha.vue组件,用于显示验证码图片。

<template>
  <div>
    <!-- 显示验证码图片,点击图片刷新验证码 -->
    <img :src="captchaImage" alt="Captcha" @click="refreshCaptcha" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      captchaImage: "" // 验证码图片的URL
    };
  },
  mounted() {
    this.refreshCaptcha(); // 组件挂载时刷新验证码
  },
  methods: {
    refreshCaptcha() {
      this.captchaImage = `/api/captcha?t=${Date.now()}`; // 刷新验证码图片的URL,添加时间戳以避免缓存
    }
  }
};
</script>

<style scoped>
img {
  cursor: pointer; // 设置鼠标指针样式为手型
}
</style>

在登录页面使用验证码组件:在你的登录页面的代码中,使用Captcha组件来显示验证码图片,并在表单中添加一个输入框用于用户输入验证码。

<template>
  <div>
    <h1>Login Page</h1>
    <form @submit="submitForm">
      <input type="text" v-model="username" placeholder="Username" />
      <input type="password" v-model="password" placeholder="Password" />
      
      <!-- 显示验证码图片,并添加点击事件刷新验证码 -->
      <input type="text" v-model="captcha" placeholder="Captcha" />
      <captcha></captcha>
      
      <button type="submit">Login</button>
    </form>
  </div>
</template>

<script>
import Captcha from "@/components/Captcha.vue";

export default {
  data() {
    return {
      username: "",
      password: "",
      captcha: ""
    };
  },
  methods: {
    submitForm() {
      // 在此处进行登录验证和验证码验证的逻辑
      console.log("Username:", this.username);
      console.log("Password:", this.password);
      console.log("Captcha:", this.captcha);
    }
  },
  components: {
    Captcha
  }
};
</script>

这样,当用户访问登录页面时,会生成并显示一个验证码图片。用户可以点击验证码图片来刷新验证码。在提交登录表单时,你可以在后端进行相应的验证码验证逻辑,以确保用户输入的验证码与生成的验证码一致。
请确保你已正确安装了相关依赖,并根据你的项目结构和需求进行相应的路径和配置调整。以上代码只是一个示例,你可以根据实际情况进行修改和扩展。

扩展
0---------------------------------------------------0
<dependency> 是 Maven 项目中用于管理依赖的标签。在这段代码中,<dependency> 标签用于指定项目所依赖的库(Artifact)的相关信息。
具体来说:
<groupId>:指定库的 Group ID,即库所属的组织或者项目的标识符。在这里,
nl.captcha 表示这个库是由名为 “nl.captcha” 的组织提供。
<artifactId>:指定库的 Artifact ID,即库的唯一标识符。在这里,
simplecaptcha 表示这个库的名称为 “simplecaptcha”。
<version>:指定库的版本号。在这里,
1.2.2 表示使用的是 “simplecaptcha” 库的版本 1.2.2。
通过在 Maven 项目的 pom.xml 文件中添加这段 <dependency> 代码,你就可以告诉 Maven 构建系统,你的项目需要使用 “simplecaptcha” 库,并且指定了具体的版本号。当你构建项目时,Maven 会自动下载并管理这个库的相关依赖。
简而言之,这段代码的目的是在 Maven 项目中添加 “simplecaptcha” 库作为项目的依赖,以便在代码中使用该库提供的功能。
SimpleCaptcha 是一个开源的 Java 库,用于生成和验证图像验证码。它提供了一个简单而灵活的方式来创建各种类型的验证码,包括文本、数字、字母、数学等。
SimpleCaptcha 的主要特点和功能包括:
高度可定制化:SimpleCaptcha 允许你通过配置各种参数来定制生成的验证码,例如验证码的长度、字体样式、字体颜色、背景样式、干扰线等。你可以根据自己的需求创建符合你应用程序风格的验证码。

多种验证码类型:SimpleCaptcha 支持多种验证码类型,包括文本验证码、数字验证码、字母验证码、数学验证码等。你可以选择适合你应用场景的验证码类型。

高度可读性:生成的验证码图像具有良好的可读性,确保用户能够轻松辨认验证码。

防止自动化攻击:通过添加干扰线、噪点等特征,SimpleCaptcha 增加了验证码的复杂度,提高了验证码的安全性,减少了自动化攻击的风险。

简单易用:SimpleCaptcha 提供了简单的 API,使得在你的 Java 应用程序中集成和使用验证码变得非常容易。

可以使用 SimpleCaptcha 来为你的应用程序添加验证码功能,以增强用户验证和安全性。它适用于各种场景,如用户注册、登录、重置密码、防止恶意攻击等。
可以在 SimpleCaptcha 的官方网站或者其 GitHub 页面获取更多关于 SimpleCaptcha 的详细信息、文档和示例代码:https://www.simplecaptcha.org/

感觉不错记得一键三连哦!!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【项目功能模块】SpringBoot+vue实现登录图片验证码 的相关文章

  • 方法重载。你能过度使用它吗?

    当定义多个使用不同过滤器返回相同形状的数据的方法时 什么是更好的做法 显式方法名称或重载方法 例如 如果我有一些产品并且我正在从数据库中提取 显式方式 public List
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • Guice:当 FactoryBuilder 中提供合适的构造函数时,“找不到合适的构造函数”

    我使用 Guice 进行依赖注入 但收到此错误 1 Could not find a suitable constructor in java lang Void Classes must have either one and only
  • 如何通过两跳 SSH 隧道使用 JProfiler

    我正在尝试将 JProfiler 连接到在我将调用的服务器上运行的 JVMremote 该服务器只能从我的工作站访问 local 通过我将调用的另一台服务器middle 我的计划是将 JProfiler 连接到remote是这样的 安装 J
  • 如何将 Cucumber 中的数据表转换为对象列表?

    原标题 Java 中的 Cucumber DataTables 中的标量是什么意思 From 参考 Java 提供了几种标量类型 这些包括原始数字 类型 加上布尔值和字符 每个标量 原始 类型都有一个关联的包装类或 参考类型 阅读javad
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • 外部化 Spring Security 配置?

    我有一个 Web 应用程序 可以使用 Spring Security 的几种不同配置 但是 这些差异配置都是在我的 applicationContext 配置文件中设置的 因此 为了在客户站点调整这些内容 必须在 WAR 文件内修改这些内容
  • 声纳要求将这一领域定为最终目标

    我的程序中有以下代码 在与 Maven 集成后 我正在运行 SonarQube 5 对其进行代码质量检查 我面临这个错误 将此 public static processStatus 字段设为最终字段 将此 public static pr
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • Poi:从 xlsm 打开 Excel 文件后将其保存为 xlsx

    我正在编写一个java程序 它打开一个用户定义的excel文件 用数据填充它 然后将其保存在用户指定的路径 文件名和扩展名下 即使输入文件是 xlsm 也应该可以声明输出保存为 xlsx 但实际上是不可能的 如果我尝试使用下面的代码 打开文
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 抛出 UnsupportedOperationException

    因此其中一种方法的描述如下 public BasicLinkedList addToFront T data 该操作无效 对于排序列表 将生成 UnsupportedOperationException 使用消息 排序列表的操作无效 我的代
  • java中从视频中提取图像

    我想知道如何使用 JMF 从视频中提取图像 Player player Manager createRealizedPlayer cdi getLocator player start FrameGrabbingControl frameG
  • 在Java中,为什么某些变量首先需要初始化,而其他变量只需要声明?

    我试图更深入地理解我是否遗漏了一些关于 Java 何时需要变量初始化与简单声明的理解 在以下代码中 不需要为变量 row 赋值即可编译和运行 但变量 column 则需要赋值 注意 该程序没有任何用处 它已被修剪为仅显示此问题所需的内容 以
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 最新版本 6.* Struts2 支持 Tomcat 10 吗? [复制]

    这个问题在这里已经有答案了 最新版本 6 Struts2 支持 Tomcat 10 吗 异常启动过滤器 struts2 java lang ClassCastException class org apache struts2 dispat

随机推荐

  • 将Qt、OpenGL、GLSL以及Qt的Graphics-View框架组合

    将Qt OpenGL GLSL以及Qt的Graphics View框架结合 将Qt OpenGL GLSL以及Qt的Graphics View框架结合 九月份都快过去了 学生们也都开学了 我想校园也会热闹许多吧 在希赛上也相应地热闹了一些
  • nginx--启动脚本

    bin bash Use Startup script for the nginx HTTP Server Definition Global environment variable IFS t n unset f unalias una
  • 瞎玩物联网系列--Hello 树莓派

    条件 Raspberry Pi 3b 32G存储卡 mac 网线 面包板 led灯 杜邦线 传感器若干 系统安装 各种下载 官方镜像下载 树莓派实验室地址 刻录工具 etcher Microsoft Remote Desktop for M
  • 二叉搜索树的定义、查找、插入和删除

    二叉搜索树的定义 查找 插入和删除 原创 2016年07月21日 21 59 00 二叉搜索树的定义 二叉搜索树 也称有序二叉树 排序二叉树 是指一棵空树或者具有下列性质的二叉树 1 若任意节点的左子树不空 则左子树上所有结点的值均小于它的
  • 不用swap分区,用交换文件(转)

    不用swap分区 用交换文件 转 more 安装linux时 一般系统都要求划分一个分区作为交换分区 但现时大家的电脑内存一般都很大 系统交换文件的机会会越来越少 就以我的来说 本人安装的是redhat linux V7 3 内存是256M
  • BGP距离协议①

    边界网关协议 边界网关协议分为内部网关协议和外部网关协议 IGP 内部网关协议 RIP OSPF EGP 外部网关协议 BGP AS自治系统 由单一的机构 组织所管理的一系列IP网络及设备所构成的集合 使用AS自治系统来划分内部和外部网关协
  • 数据库原理 具有检查点的恢复技术

    1 为什么需要检查点 搜索整个日志文件需要耗费的时间很多 重做处理 重新执行 耗费了大量的时间 2 解决方案是什么 在日志文件中增加检查点 check point 记录 增加重新开始文件 恢复子系统在登录日志文件期间动态的维护日志 3 检查
  • CPU测试相关工具搜集

    CPU测试相关工具搜集 一 y cruncher CPU性能测试工具 二 CPU Z CPU参数查看工具 三 cachesize 读取CPU Cache信息 四 Flops CPU浮点运算性能测试工具 五 Open Hardware Mon
  • IDEA找不到Maven窗口

    有时候导入项目或者创建项目时候Maven窗口找不到了 然后指定项目的pom xml文件
  • 缘结西安

    2021年6月1日上午 CSDN创始人 董事长蒋涛 首席运营官钟晖 副总裁李超 长沙首席技术官陈玉龙 高校俱乐部负责人张建龙 市场总监段思倍等到达西安思源学院 与学校就校企合作达成共识 正式结为校企战略合作伙伴 下午 CSDN董事长蒋涛以
  • C++基础——拷贝构造函数

    前言 在上篇文章中 我简单介绍了一下类的两大特殊函数 构造函数和析构函数 构造函数主要用来进行对象的成员变量初始化操作 而析构函数主要用来对战斗后的战场做清理工作 当我们不写这些函数时 编译器会自动生成默认的构造与析构函数 帮助我们合理的运
  • 数据挖掘:探索性数据分析(EDA)

    数据挖掘 探索性数据分析 EDA 一 什么是探索性数据分析 EDA Exploratory Data Analysis 即对数据进行探索性的分析 充分了解数据 为之后的数据清洗和特征工程等提供想法和结论 在探索分析时 也可进行数据清洗的工作
  • 二维字符数组中字符串查找

    首先输入一个数字N 接着输入N行字符 每个字符用逗号分隔 最终形成一个N N的字符数组 然后再输入一个待查找的目标字符串 在上面字符数组中查找是否出现目标字符串 查找的规则是在起始位置 从左向右 或者 从上向下 每个单元格的字符只出现一次
  • 百度网盘 文件名中(文件)含有敏感词

    百度网盘 文件名中含有敏感词 CreateTime 2018年5月3日08 17 58 Author Marydon 1 情景还原 2 解决方案 新建一个文件夹 gt 分享 分享成功 再将真正要分享的文件移动到已经分享的文件夹下 即可 测试
  • 【WSN通信】能量均衡的无线传感器网络非均匀分簇路由协议附matlab代码

    1 简介 提出了一种能量高效均衡 非均匀分簇和簇间多跳路由有机结合的无线传感器网络分布式分簇路由协议DEBUC distributed energy balanced unequal clustering routing protocol
  • 软考考试多少分算通过?

    软考证书取得需要达到总分45分 每门科目满分为75分 因此 不要小看45分 在考试中获得这个分数并不容易 此外 软考要求一次性通过 如果没有通过 成绩将不被保留 因此 必须在一次考试中成功通过所有科目 否则就需要重新参加考试 如果考生只通过
  • 如何在ubuntu交叉编译qt5程序发布到rk3568 Linux开发板运行?

    如何在ubuntu交叉编译qt5程序发布到rk3568 Linux开发板运行 本文将介绍如何在ubuntu搭建qt的开发环境和第一个helloworld程序的创建 构建过程 1 下载安装交叉编译工具 拷贝 rk3568 linux preb
  • java图片压缩,使用ImageIO代替JPEGImageEncoder

    最近做项目需要图片压缩处理 网上找的方法大都使用了 com sun image codec jpeg 这个包中的JPEGImageEncoder类 引入这个包后一直报错 各种google百度 尝试了各种方法 包括手动引jre中的rt jar
  • Stata打开自带的数据合集

    1 sysuse命令 这个命令是用来打开stata内置的数据 sysues dir 列出自带数据的目录 第一列的数据为股票的数据 分别是宁德时代 深证成指 贵州茅台 东方证券 auto dta是1978年在美国销售的74个车牌号的汽车的技术
  • 【项目功能模块】SpringBoot+vue实现登录图片验证码

    SpringBoot vue实现登录图片验证码 要在Spring Boot和Vue中实现登录时的图片验证码功能 可以按照以下步骤进行操作 后端 Spring Boot 实现 添加相关依赖 在 pom xml文件中添加以下依赖