Go生成base64图片验证码实例(超详细工具类)

 更新时间:2023年06月25日 11:07:38   作者:xkzeee  
这段时间需要使用图片验证码库,下面这篇文章主要给大家介绍了关于Go生成base64图片验证码的相关资料,文中给出了详细的实例代码,需要的朋友可以参考下

前言

之前网上的很多例子都很旧了,这次我分享的是最新版本的使用,注意以下所有代码均在同一个go文件中,我只是分开讲解了每一块的作用,最终使用直接调用 CreateCode() 方法即可,验证调用 VerifyCaptcha(id, VerifyValue string) 方法即可

本工具类是使用 base64Captcha 库进行图片验证码的生成,如下图所示:

1.下载依赖包

先下载生成图片验证码所需要的依赖包 go get github.com/mojocn/base64Captcha

2.创建图片验证码存储对象

2.1 创建默认的对象

使用DefaultMemStore 创建的对象,存储的验证码为 10240 个,过期时间为 10分钟

var result = base64Captcha.DefaultMemStore

2.2 创建自定义的对象

根据自己需求更改验证码存储上限,以下代码设置存储的验证码为 20240个,过期时间为 3分钟

var result = base64Captcha.NewMemoryStore(20240, 3*time.Minute)

3.配置各种类型的图片验证码的配置

以下配置是按照自己的爱好来配置的

如果想更改,可以从这个网站来查看各种图片验证码的配置:https://captcha.mojotv.cn/

// mathConfig 生成图形化算术验证码配置
func mathConfig() *base64Captcha.DriverMath {
	mathType := &base64Captcha.DriverMath{
		Height:          50,
		Width:           100,
		NoiseCount:      0,
		ShowLineOptions: base64Captcha.OptionShowHollowLine,
		BgColor: &color.RGBA{
			R: 40,
			G: 30,
			B: 89,
			A: 29,
		},
		Fonts: nil,
	}
	return mathType
}

// digitConfig 生成图形化数字验证码配置
func digitConfig() *base64Captcha.DriverDigit {
	digitType := &base64Captcha.DriverDigit{
		Height:   50,
		Width:    100,
		Length:   5,
		MaxSkew:  0.45,
		DotCount: 80,
	}
	return digitType
}

// stringConfig 生成图形化字符串验证码配置
func stringConfig() *base64Captcha.DriverString {
	stringType := &base64Captcha.DriverString{
		Height:          100,
		Width:           50,
		NoiseCount:      0,
		ShowLineOptions: base64Captcha.OptionShowHollowLine | base64Captcha.OptionShowSlimeLine,
		Length:          5,
		Source:          "123456789qwertyuiopasdfghjklzxcvb",
		BgColor: &color.RGBA{
			R: 40,
			G: 30,
			B: 89,
			A: 29,
		},
		Fonts: nil,
	}
	return stringType
}

// chineseConfig 生成图形化汉字验证码配置
func chineseConfig() *base64Captcha.DriverChinese {
	chineseType := &base64Captcha.DriverChinese{
		Height:          50,
		Width:           100,
		NoiseCount:      0,
		ShowLineOptions: base64Captcha.OptionShowSlimeLine,
		Length:          2,
		Source:          "设想,你在,处理,消费者,的音,频输,出音,频可,能无,论什,么都,没有,任何,输出,或者,它可,能是,单声道,立体声,或是,环绕立,体声的,不想要,的值",
		BgColor: &color.RGBA{
			R: 40,
			G: 30,
			B: 89,
			A: 29,
		},
		Fonts: nil,
	}
	return chineseType
}

// autoConfig 生成图形化数字音频验证码配置
func autoConfig() *base64Captcha.DriverAudio {
	chineseType := &base64Captcha.DriverAudio{
		Length:   4,
		Language: "zh",
	}
	return chineseType
}

4.创建图片验证码

注意:我这里的配置viper.GetString("code.captcha_type") 是读取的yaml配置文件设置的,大家可以自行设置
audio 音频验证码、string 字符串+数字验证码、math 算术运算验证码、chinese 纯汉字验证码、digit 纯数字验证码

// @Result id 验证码id
// @Result bse64s 图片base64编码
// @Result err 错误
func CreateCode() (string, string, error) {
	var driver base64Captcha.Driver
	// switch case分支中的方法为目录3的配置
	// switch case分支中的方法为目录3的配置
	// switch case分支中的方法为目录3的配置
	switch viper.GetString("code.captcha_type") {
	case "audio":
		driver = autoConfig()
	case "string":
		driver = stringConfig()
	case "math":
		driver = mathConfig()
	case "chinese":
		driver = chineseConfig()
	case "digit":
		driver = digitConfig()
	}
	if driver == nil {
		panic("生成验证码的类型没有配置,请在yaml文件中配置完再次重试启动项目")
	}
	// 创建验证码并传入创建的类型的配置,以及存储的对象
	c := base64Captcha.NewCaptcha(driver, result)
	id, b64s, err := c.Generate()
	return id, b64s, err
}

5.校验验证码

注意 Verify(id, VerifyValue, true) 中的 true参数
当为 true 时,校验 传入的id 的验证码,校验完 这个ID的验证码就要在内存中删除
当为 false 时,校验 传入的id 的验证码,校验完 这个ID的验证码不删除

// @Pram id 验证码id
// @Pram VerifyValue 用户输入的答案
// @Result true:正确,false:失败
func VerifyCaptcha(id, VerifyValue string) bool {
	// result 为步骤1 创建的图片验证码存储对象
	return result.Verify(id, VerifyValue, true)
}

6.获取验证码答案

注意 Get(codeId, false) 中的 false 参数
当为 true 时,根据ID获取完验证码就要删除这个验证码
当为 false 时,根据ID获取完验证码不删除

// @Pram codeId 验证码id
// @Result 验证码答案
func GetCodeAnswer(codeId string) string {
	// result 为步骤1 创建的图片验证码存储对象
	return result.Get(codeId, false)
}

总结

到此这篇关于Go生成base64图片验证码的文章就介绍到这了,更多相关Go生成base64图片验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Golang实现WebSocket心跳机制

    使用Golang实现WebSocket心跳机制

    WebSocket是一种在客户端和服务器之间实现全双工通信的协议,它允许实时地传输数据,并且比传统的HTTP请求更加高效,在使用Golang构建WebSocket应用程序时,一个重要的考虑因素是如何实现心跳机制,所以本文将探讨如何使用Golang实现WebSocket心跳
    2023-11-11
  • golang之反射和断言的具体使用

    golang之反射和断言的具体使用

    这篇文章主要介绍了golang之反射和断言的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • golang中的struct操作

    golang中的struct操作

    结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。下面介绍下golang中的struct,感兴趣的朋友一起看看吧
    2021-11-11
  • Golang Gin框架中间件的用法详解

    Golang Gin框架中间件的用法详解

    中间件是Gin框架中的一个核心概念,它允许开发者在处理HTTP请求的过程中插入自定义的钩子函数,从而实现诸如日志记录、身份验证、权限控制等公共逻辑,本文将结合实际案例,详细讲解Gin框架中间件的用法
    2024-10-10
  • Go 1.21中引入的新包maps和cmp功能作用详解

    Go 1.21中引入的新包maps和cmp功能作用详解

    这篇文章主要为大家介绍了Go 1.21中引入的新包maps和cmp功能作用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go语言实现简单的一个静态WEB服务器

    Go语言实现简单的一个静态WEB服务器

    这篇文章主要介绍了Go语言实现简单的一个静态WEB服务器,本文给出了实现代码和运行效果,学习Golang的练手作品,需要的朋友可以参考下
    2014-10-10
  • golang testing使用示例小结

    golang testing使用示例小结

    golang自带了testing测试包,使用该包可以进行自动化的单元测试,输出结果验证,并且可以测试性能,下面通过示例代码给大家讲解golang testing使用示例小结,感兴趣的朋友一起看看吧
    2024-05-05
  • Go语言中的字符串处理方法示例详解

    Go语言中的字符串处理方法示例详解

    Go语言的字符串是使用UTF-8编码的。UTF-8是Unicode的实现方式之一。这篇文章主要介绍了Go语言中的字符串处理方法,需要的朋友可以参考下
    2018-10-10
  • Go-客户信息关系系统的实现

    Go-客户信息关系系统的实现

    这篇文章主要介绍了Go-客户信息关系系统的实现,本文章内容详细,具有很好的参考价值,希望对大家有所帮助,需要的朋友可以参考下
    2023-01-01
  • golang分层测试之http接口测试入门教程

    golang分层测试之http接口测试入门教程

    这篇文章主要介绍了golang分层测试之http接口测试入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论