最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang圖片驗證碼的使用方法

 更新時間:2024年05月07日 10:30:34   作者:GEEK JUMP  
最近在使用到Golang進行原生開發(fā),注冊和登錄頁面都涉及到圖片驗證碼的功能,支持很多類型的驗證方式,例如支持數(shù)字類型、字母類型、音頻驗證碼、中文驗證碼,本文給大家介紹Golang圖片驗證碼的使用,感興趣的朋友跟隨小編一起看看吧

一、背景

        最近在使用到Golang進行原生開發(fā),注冊和登錄頁面都涉及到圖片驗證碼的功能。找了下第三方庫的一些實現(xiàn),發(fā)現(xiàn)了這個庫用得還是蠻多的。并且支持很多類型的驗證方式,例如支持數(shù)字類型、字母類型、音頻驗證碼、中文驗證碼等等。 

        項目地址: https://github.com/mojocn/base64Captcha

        官方文檔地址: https://captcha.mojotv.cn/.netlify/functions/captcha

        支持多種驗證碼類型(多種驗證碼驅動):

二、基本使用

1、生成驗證碼base64字符串

生成驗證碼的基本邏輯順序如下:

        0、需要準備存儲驗證碼的一種驅動實現(xiàn)Store接口,庫中有一個基于Store接口的內存存儲方案的默認實現(xiàn)類: base64Captcha.DefaultMemStore

        1、需要定義生成驗證碼類型的Driver驅動類實例, 配置驗證碼信息,例如圖片大小、高度、模糊度等等

        2、通過base64Captcha.NewCaptcha(&driver, store),生成驗證碼的base64字符串、驗證碼ID、驗證碼的答案、以及error信息, 最后重點拿到驗證碼ID、驗證碼base64字符串響應給前端進行展示

        3、最后底層會將數(shù)據(jù)存儲到store存儲方式中,這個store類實現(xiàn)了Store接口,將驗證碼信息進行存儲

// 這里我自己實現(xiàn)了一個基于Redis的Store存儲驅動類
var store = captcha.NewRedisStore(db.GetRedisConn())
func GenCaptcha() (string, string) {
    // 設置驗證碼驅動類型,這里是數(shù)字運算類型的驗證碼 
    // 例如會生成幾個數(shù)的基本運算, 最后求運算結果作為驗證碼結果
	driver := base64Captcha.DriverMath{          
		Height:     50,
		Width:      200,
		NoiseCount: 0,
	}
	captchaObj := base64Captcha.NewCaptcha(&driver, store)
	captchaId, b64s, _, err := captchaObj.Generate()
	if err != nil {
		panic(err.Error())
	}
	return captchaId, b64s // 拿到驗證碼ID、驗證碼的base64字符串
}

        拿到驗證碼ID、驗證碼的base64字符串, 前端頁面使用一個隱藏的input存儲驗證碼ID、一個input作為表單提交驗證碼的值、一個img標簽,將src設置為這個base64字符串,即可正常顯示這個驗證碼.

        前端局部代碼如下:

        顯示效果如下:

        后端查看Redis的存儲信息:  可以看到驗證碼ID、驗證碼答案 8 x 5 = 40

2、后端校驗驗證碼

 后端校驗的大致邏輯就是:

        0、需要準備存儲驗證碼的一種驅動實現(xiàn)store,庫有有一個基于Store接口的內存存儲方案的實現(xiàn)類base64Captcha.DefaultMemStore。 這個使用剛才和生成驗證碼的store變量一樣即可

        1、直接通過store對象,調用Verify方法,傳遞驗證碼ID、以及驗證碼答案即可, 驗證結果返回true則代表通過, 返回false則表示不通過. 還有一個參數(shù)clear(bool), 代表執(zhí)行驗證后無論是否通過,都需要將這個驗證碼刪除/作廢

func VerifyCaptcha(captchaId string, answer string) bool {
	return store.Verify(captchaId, answer, true)
}

后端獲取驗證碼,進行校驗的代碼截圖:

3、Redis存儲驅動代碼: RedisStore

非生產(chǎn)環(huán)境代碼,只是簡單示例,請勿使用在生產(chǎn)環(huán)境。 因為有些邏輯沒有做嚴格校驗以及測試

package captcha
import (
	"context"
	"github.com/redis/go-redis/v9"
	"sync"
	"time"
)
const captchaKey = "string:captcha:"
var ctx = context.Background()
type RedisStore struct {
	redisClient *redis.Client
	mtx         sync.Mutex
}
func (r *RedisStore) Set(id string, value string) error {
	r.mtx.Lock()
	defer r.mtx.Unlock()
	key := captchaKey + id
	result := r.redisClient.SetNX(ctx, key, value, time.Second*60)
	if result.Err() != nil {
		return result.Err()
	}
	return nil
}
func (r *RedisStore) Get(id string, clear bool) string {
	r.mtx.Lock()
	defer r.mtx.Unlock()
	key := captchaKey + id
	result := r.redisClient.Get(ctx, key)
	if result.Err() != nil {
		return ""
	}
	if clear {
		go r.redisClient.Del(ctx, key)
	}
	return result.Val()
}
func (r *RedisStore) Verify(id, answer string, clear bool) bool {
	r.mtx.Lock()
	defer r.mtx.Unlock()
	key := captchaKey + id
	result := r.redisClient.Get(ctx, key)
	if result.Err() != nil {
		return false
	}
	storeAnswer := result.Val()
	if clear {
		go r.redisClient.Del(ctx, key)
	}
	return answer == storeAnswer
}
func NewRedisStore(redisClient *redis.Client) *RedisStore {
	return &RedisStore{
		redisClient: redisClient,
		mtx:         sync.Mutex{},
	}
}

三、總結

        使用mojocn/base64Captcha庫可以簡單的生成驗證碼base64圖片信息,方便了我們進行Web開發(fā)。 如果需要更高級或者詳細的使用方式,請查看官方文檔。

        在實現(xiàn)Store存儲驅動的時候,還要考慮我們的圖片驗證碼例如訪問頻率限制、怎么針對有特征的客戶端進行限流, 除了驗證碼有過期時間以外,  如是否有IP訪問限流? 或者其他防御手段, 這樣才能確保我們的后端Redis不會被惡意刷新,導致Redis內存撐爆了. 

到此這篇關于Golang圖片驗證碼的使用的文章就介紹到這了,更多相關Golang圖片驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Go實現(xiàn)郵箱驗證碼API功能

    使用Go實現(xiàn)郵箱驗證碼API功能

    本文將帶你了解一個項目如何實現(xiàn)一個郵箱驗證接口,即一個可用的發(fā)送郵箱驗證碼API和驗證驗證碼是否正確功能,對Go實現(xiàn)郵箱驗證碼API詳細過程感興趣的朋友一起看看吧
    2024-06-06
  • Go處理JSON數(shù)據(jù)的實現(xiàn)

    Go處理JSON數(shù)據(jù)的實現(xiàn)

    本文主要介紹了Go處理JSON數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • golang爬蟲colly?發(fā)送post請求

    golang爬蟲colly?發(fā)送post請求

    本文主要介紹了golang爬蟲colly?發(fā)送post請求實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 使用golang-unsafe包的注意事項及說明

    使用golang-unsafe包的注意事項及說明

    這篇文章主要介紹了使用golang-unsafe包的注意事項及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    golang如何實現(xiàn)抓取IP地址的蜘蛛程序詳解

    這篇文章主要給大家介紹了關于利用golang如何實現(xiàn)抓取IP地址的蜘蛛程序的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • Go語言中的自定義類型你了解嗎

    Go語言中的自定義類型你了解嗎

    自定義類型是 Go 語言中非常重要的概念之一,通過自定義類型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護性。本文將從以下幾個方面介紹 Go 自定義類型的相關知識,感興趣的可以了解一下
    2023-04-04
  • Golang Http請求返回結果處理

    Golang Http請求返回結果處理

    本文主要介紹了Golang Http請求返回結果處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Go并發(fā)限制之限流與控制并發(fā)數(shù)的實踐指南

    Go并發(fā)限制之限流與控制并發(fā)數(shù)的實踐指南

    在 Go 并發(fā)編程中,一個非?,F(xiàn)實的問題是:goroutine很輕量,但不是無限資源,當你隨手 go func() 起上成千上萬的協(xié)程時,系統(tǒng)可能不會立刻崩,但會在某個瞬間出現(xiàn)問題,所以一個核心能力就是:如何控制并發(fā)數(shù)量與訪問速率(限流),本文小編為大家詳細介紹一下
    2026-04-04
  • GO語言實現(xiàn)AES-CFB加密的操作方法

    GO語言實現(xiàn)AES-CFB加密的操作方法

    本文介紹了如何用Go語言實現(xiàn)AES-CFB加密和解密,首先,定義一個屬于encrypt包的文件,使用AES算法、CFB模式和Base64編碼等功能,在加密函數(shù)中,接收明文和密鑰,生成一個AES塊密碼和一個隨機的初始化向量,實現(xiàn)明文的加密
    2024-10-10
  • golang中的struct操作

    golang中的struct操作

    結構體是一種聚合的數(shù)據(jù)類型,是由零個或多個任意類型的值聚合成的實體,每個值稱為結構體的成員。下面介紹下golang中的struct,感興趣的朋友一起看看吧
    2021-11-11

最新評論

汕尾市| 保康县| 儋州市| 会昌县| 兴隆县| 航空| 宝鸡市| 黔江区| 寻乌县| 仪陇县| 胶州市| 大同市| 凤山县| 阿拉善右旗| 博客| 钦州市| 吉水县| 郯城县| 新源县| 晋江市| 潼南县| 凌云县| 张家川| 洪湖市| 安顺市| 卢龙县| 涟水县| 德惠市| 濮阳市| 崇州市| 潍坊市| 高平市| 呼伦贝尔市| 瓮安县| 南汇区| 双鸭山市| 万年县| 洞口县| 临沂市| 镇宁| 墨江|