谷歌验证码kaptcha使用(包括前端获取获取解析)

news2024/9/21 22:33:54

1.后端

基于springboot开发。

包结构 

1.导入依赖

<!--kaptcha验证码生成器-->
		<dependency>
			<groupId>com.github.axet</groupId>
			<artifactId>kaptcha</artifactId>
			<version>0.0.9</version>
		</dependency>

2.配置类

@Configuration
public class CaptchaConfig {
    @Bean
    public DefaultKaptcha defaultKaptcha(){
        // 验证码生成器
        DefaultKaptcha captcha = new DefaultKaptcha();
        // 配置
        Properties properties = new Properties();
        //是否有边框
        properties.setProperty("kaptcha.border", "yes");
        //设置边框颜色
        properties.setProperty("kaptcha.border.color", "105,179,90");
        //边框粗细度,默认为1
        // properties.setProperty("kaptcha.border.thickness","1");
        //验证码
        properties.setProperty("kaptcha.session.key","code");
        //验证码文本字符颜色 默认为黑色
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        //设置字体样式
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
        //字体大小,默认40
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        //验证码文本字符内容范围 默认为abced2345678gfynmnpwx
        // properties.setProperty("kaptcha.textproducer.char.string", "");
        //字符长度,默认为5
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        //字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "4");
        //验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "100");
        //验证码图片高度 默认为40
        properties.setProperty("kaptcha.image.height", "40");
        Config config = new Config(properties);
        captcha.setConfig(config);
        return captcha;

    }
}

3.controller

@RestController
public class CaptchaController {

    @Autowired
    private DefaultKaptcha defaultKaptcha;
    
    @GetMapping(value = "/captcha",produces = "image/jpeg")
    public void getCaptcha(HttpServletRequest request, HttpServletResponse response){
        // 定义response输出类型为image/jpeg类型
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");

        //-------------------生成验证码 begin --------------------------
        //获取验证码文本内容
        String text = defaultKaptcha.createText();
        //将验证码文本内容放入session
        request.getSession().setAttribute("captcha",text);
        // 创建验证码图像
        BufferedImage image = defaultKaptcha.createImage(text);
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            //输出流输出图片,格式为jpg
            ImageIO.write(image,"jpg",outputStream);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (null!=outputStream){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

2.前端

基于 vue 和 axios,这里只展示请求部分,如何拿到后端验证码图片的src路径

axios请求api

// 获取验证码
export function getCaptcha(){
    return request({
        method:"get",
        url: "/captcha",
        responseType:"blob" // 指定响应类型为二进制数据
    })
}

 根据请求api发起请求拿数据

   import {getCaptcha} from "@/api/login.js"

 // 获取验证码
    getCaptcha(){
      getCaptcha().then((resp)=>{
        const imgData = resp.data; // 拿到图片的二进制数据
        const imgSrc = URL.createObjectURL(new Blob([imgData],{type:'image/png'})) // 将二进制转换成url路径
        this.captcha = imgSrc;   
      })
    },

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

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

相关文章

从零开始:深度学习入门资料推荐

还记得几年前刚入坑的时候&#xff0c;老师给的入门资料就是一堆论文&#xff01;害的我差点放弃。。。 如今深度学习应用的开发成本越来越低&#xff0c;学习资料越来越多&#xff0c;于是对初学者来说进入了另一个相反的困境——资料过多&#xff0c;让人眼花缭乱&#xff0…

ASEMI整流桥MB6S是什么电子元件

编辑-Z 在电子工程领域&#xff0c;整流器是一种常见的电子设备&#xff0c;用于将交流电&#xff08;AC&#xff09;转换为直流电&#xff08;DC&#xff09;。其中&#xff0c;整流桥MB6S是一种广泛使用的整流器&#xff0c;以其高效、稳定和可靠的性能赢得了工程师们的青睐…

[Container]Hadoop集群镜像打包

文章目录 Docker DNS配置Linux Docker DNS设置Windows、MacOs Docker DNS设置 打包HadoopDockerfile打包文件参数声明和基础镜像引入安装相关依赖库创建普通用户下载或导入软件包环境变量配置 初始化脚本参数配置${HADOOP_CONF_DIR}/workers工作节点${HADOOP_CONF_DIR}/hadoop-…

97、基于stm32单片机智能药箱药盒温湿度体温光照时钟wifi手机APP监控(程序+原理图+PCB源文件+手机APP源码+硬件设计资料+元器件清单等)

单片机类型选择 方案一&#xff1a;可以使用现在比较主流的单片机STC89C5单片机进行数据处理。这款单片机具有的特点是内存和51的单片机相比多了4KB内存&#xff0c;但是价格和51单片机一样。并且支持数据串行下载和调试助手。此款单片机是有ATMEL公司生产&#xff0c;可用5V电…

appium自动化测试之PO模型设计

目录 PO模型 PO分层 PO模型设计框架 config目录 common目录 pages目录 function目录 case目录 logs目录 report目录 runTest.py文件 总结&#xff1a; 我们在做自动化的时候应该都听过PO模型&#xff0c;那么什么是PO模型呢&#xff1f;PO模型在自动化中的作用是什…

【链表OJ】删除链表中重复的结点

⭐️ 往期链表相关OJ &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1…

第二章React全家桶之面向组件编程

文章目录 一、组件的基本理解和使用1-1、函数式组件1-2、类式组件 二、组件实例的三大核心属性2-1、state的基本使用2-2-1、state的总结 2-2、props的基本使用2-2-1、props的传值与批量传值2-2-2、对props进行限制2-2-3、props的简写2-2-4、类式组件中的构造器与props2-2-5、函…

使用 eKuiper 按需桥接 CAN Bus 数据至 MQTT

CAN Bus 是一种广泛应用于汽车和工业领域的通信协议&#xff0c;它能够让多个设备在同一网络中进行交互。而 MQTT 是一种广泛应用于物联网领域的通信协议&#xff0c;作为一种轻量级的发布-订阅消息传输协议&#xff0c;它有效地促进了机器之间的通信。 通过将 CAN Bus 数据桥…

Vue组件库Element-常见组件-分页

常见组件-Pagination 分页 Pagination 分页&#xff1a;当数据过多时&#xff0c;会使用分页分解数据 具体关键代码如下&#xff1a;&#xff08;重视注释&#xff09; <template><div><!-- Pagination 分页 --><el-pagination background layout"…

Etsy店铺被封的原因是什么?如何防封

ETSY是一个全球知名的在线市场和电商平台&#xff0c;专注于手工艺品、独特商品和创意艺术。它为卖家提供了一个平台来展示和销售自己的手工制品、艺术品、珠宝、家居用品、时尚配饰等各种创意产品。作为一个颇受中国商家青睐的平台&#xff0c;Etsy在账号检测方面也是不亚于亚…

微软MFC技术中消息的分类

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来聊聊MFC技术中消息的分类。 微软Windows中的消息虽然很多&#xff0c;但是种类并不繁杂&#xff0c;大体上有3种&#xff1a;窗口消息、命令消息和控件通知消息。 窗口消息 窗口消息是系统中最为常见…

网络安全(黑客)自学路线

一.零基础学习 在网络安全的学习过程中&#xff0c;基础知识是一个绕不过的问题&#xff0c;Web知识本身就非常丰富&#xff0c;覆盖范围也非常广泛。 首先是大家比较熟悉的浏览器、数据库、服务器&#xff1b; 以及由简到难的HTML、JavaScript和CSS、PHP、Java、.net&#…

【Flutter】使用 Drift 实现 Flutter 数据持久化

文章目录 一、前言二、版本信息三、Drift 简介四、如何安装和设置 Drift五、基础使用1. 创建数据库和表2. 插入、查询、更新和删除数据3. 使用事务 六、总结 一、前言 你是否渴望成为 Flutter 的专家&#xff0c;掌握更多的技巧和最佳实践&#xff1f;我们有个好消息要告诉你&…

【vue3】学习笔记--组件通信方式

学习vue3总是绕不开vue2 vue2组件通信方式总结&#xff1a; 1、props&#xff1a;可以实现父子组件&#xff0c;子父组件&#xff0c;甚至兄弟组件通信 2、自定义事件&#xff1a;实现子父组件通信 3、全局事件总线$bus:可以实现任意组件通信 4、pubsub&#xff1a;发布订阅模…

目标检测常用的评价指标

目标检测常用的评价指标 1 IoU&#xff08;Intersection over Union&#xff09;2 GIoU&#xff08;Generalized IoU&#xff09;3 DIoU&#xff08;Distance-IoU&#xff09;4 CIoU&#xff08;Complete-IoU&#xff09;5 EIoU&#xff08;Efficient-IoU&#xff09;6 SIoU7 W…

爬虫入门07——requests中携带cookie信息

爬虫入门07——requests中携带cookie信息 对于需要登陆的网站如果不携带cookie是无法获取我们所需内容的就以查看我在CSDN中的订单为例&#xff0c;在登陆后可以查看到订单信息 而当我们使用Python代码发出请求时&#xff0c;是不携带cookie&#xff0c;因此无法拿到订单相关信…

Flink的状态是否支持任务间共享

背景&#xff1a; 在日常编写代码的过程中&#xff0c;我们经常会在方法内部new很多的其他类对象来进行编码工作&#xff0c;那么对于这种情况怎么让new出来的对象是一个我们特意创建出来的一个mock实例&#xff0c;从而让我们能完全控制new出来的对象的所有行为呢&#xff1f…

【雕爷学编程】Arduino动手做(154)---AFMotor电机扩展板模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

数模混合项目:模拟跨数字走线注意事项

数模混合项目中&#xff0c;模拟在数字上走线是常有的事&#xff0c;这里需要注意几个点: 1.模拟电源在数字上走线影响不大&#xff0c;但尽量走top metal和AP层。 2.模拟高频线&#xff0c;尤其是时钟&#xff0c;尽量不要在数字上走线&#xff0c;非要走&#xff0c;最好下…

数据总线学习

为啥要数据总线 使用服务化方式发布&#xff0c;业务端和中间件完全解耦合。一处生产&#xff0c;处处消费设计理念。提供用户可定制的托管化通用消费方案&#xff08;如同步mysql到缓存&#xff0c;同步mysql到es&#xff0c;消费mysql到大数据等托管服务&#xff09; 特性 …