golang 图像验证码

为什么base64图片 for RESTful 服务

  Data URIs 支持大部分浏览器,IE8之后也支持.
  小图片使用base64响应对于RESTful服务来说更便捷

godoc文档

github在线Demo Playground Powered by Vuejs+elementUI+Axios

Playground
28+58=?.png
ACNRfd.png
rW4npZ.png
99+73=?.png
ctOv6N.png
gGncJC.png
108360.png
wav file

安装golang包

go get -u github.com/mojocn/base64Captcha

对于中国大陆Gopher go get golang.org/x/image 失败解决方案:

    mkdir -p $GOPATH/src/golang.org/x
    cd $GOPATH/src/golang.org/x
    git clone https://github.com/golang/image.git

创建图像验证码

import "github.com/mojocn/base64Captcha"
func demoCodeCaptchaCreate() {
    //config struct for digits
    //数字验证码配置
    var configD = base64Captcha.ConfigDigit{
        Height:     80,
        Width:      240,
        MaxSkew:    0.7,
        DotCount:   80,
        CaptchaLen: 5,
    }
    //config struct for audio
    //声音验证码配置
    var configA = base64Captcha.ConfigAudio{
        CaptchaLen: 6,
        Language:   "zh",
    }
    //config struct for Character
    //字符,公式,验证码配置
    var configC = base64Captcha.ConfigCharacter{
        Height:             60,
        Width:              240,
        //const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合.
        Mode:               base64Captcha.CaptchaModeNumber,
        ComplexOfNoiseText: base64Captcha.CaptchaComplexLower,
        ComplexOfNoiseDot:  base64Captcha.CaptchaComplexLower,
        IsShowHollowLine:   false,
        IsShowNoiseDot:     false,
        IsShowNoiseText:    false,
        IsShowSlimeLine:    false,
        IsShowSineLine:     false,
        CaptchaLen:         6,
    }
    //创建声音验证码
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyA, capA := base64Captcha.GenerateCaptcha("", configA)
    //以base64编码
    base64stringA := base64Captcha.CaptchaWriteToBase64Encoding(capA)
    //创建字符公式验证码.
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyC, capC := base64Captcha.GenerateCaptcha("", configC)
    //以base64编码
    base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC)
    //创建数字验证码.
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    idKeyD, capD := base64Captcha.GenerateCaptcha("", configD)
    //以base64编码
    base64stringD := base64Captcha.CaptchaWriteToBase64Encoding(capD)
    
    fmt.Println(idKeyA, base64stringA, "\n")
    fmt.Println(idKeyC, base64stringC, "\n")
    fmt.Println(idKeyD, base64stringD, "\n")
}

验证图像验证码

import "github.com/mojocn/base64Captcha"
func verfiyCaptcha(idkey,verifyValue string){
    verifyResult := base64Captcha.VerifyCaptcha(idkey, verifyValue)
    if verifyResult {
        //success
    } else {
        //fail
    }
}

使用golang搭建API服务 main.go

// example of HTTP server that uses the captcha package.
package main

import (
    "encoding/json"
    "fmt"
    "github.com/mojocn/base64Captcha"
    "log"
    "net/http"
)

//ConfigJsonBody json request body.
type ConfigJsonBody struct {
    Id              string
    CaptchaType     string
    VerifyValue     string
    ConfigAudio     base64Captcha.ConfigAudio
    ConfigCharacter base64Captcha.ConfigCharacter
    ConfigDigit     base64Captcha.ConfigDigit
}

// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {
    //parse request parameters
    //接收客户端发送来的请求参数
    decoder := json.NewDecoder(r.Body)
    var postParameters ConfigJsonBody
    err := decoder.Decode(&postParameters)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()

    //create base64 encoding captcha
    //创建base64图像验证码

    var config interface{}
    switch postParameters.CaptchaType {
    case "audio":
        config = postParameters.ConfigAudio
    case "character":
        config = postParameters.ConfigCharacter
    default:
        config = postParameters.ConfigDigit
    }
    //GenerateCaptcha 第一个参数为空字符串,包会自动在服务器一个随机种子给你产生随机uiid.
    captchaId, digitCap := base64Captcha.GenerateCaptcha(postParameters.Id, config)
    base64Png := base64Captcha.CaptchaWriteToBase64Encoding(digitCap)

    //or you can do this
    //你也可以是用默认参数 生成图像验证码
    //base64Png := captcha.GenerateCaptchaPngBase64StringDefault(captchaId)

    //set json response
    //设置json响应

    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": 1, "data": base64Png, "captchaId": captchaId, "msg": "success"}
    json.NewEncoder(w).Encode(body)
}
// base64Captcha verify http handler
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {

    //parse request parameters
    //接收客户端发送来的请求参数
    decoder := json.NewDecoder(r.Body)
    var postParameters ConfigJsonBody
    err := decoder.Decode(&postParameters)
    if err != nil {
        log.Println(err)
    }
    defer r.Body.Close()
    //verify the captcha
    //比较图像验证码
    verifyResult := base64Captcha.VerifyCaptcha(postParameters.Id, postParameters.VerifyValue)

    //set json response
    //设置json响应
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    body := map[string]interface{}{"code": "error", "data": "验证失败", "msg": "captcha failed"}
    if verifyResult {
        body = map[string]interface{}{"code": "success", "data": "验证通过", "msg": "captcha verified"}
    }
    json.NewEncoder(w).Encode(body)
}

//start a net/http server
//启动golang net/http 服务器
func main() {

    //serve Vuejs+ElementUI+Axios Web Application
    http.Handle("/", http.FileServer(http.Dir("./static")))

    //api for create captcha
    //创建图像验证码api
    http.HandleFunc("/api/getCaptcha", generateCaptchaHandler)

    //api for verify captcha
    http.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)

    fmt.Println("Server is at localhost:3333")
    if err := http.ListenAndServe("localhost:3333", nil); err != nil {
        log.Fatal(err)
    }
}

运行demo代码

cd $GOPATH/src/github.com/mojocn/captcha/examples
go run main.go

golang后端
Go语言后端技术分享,希望 [链接]的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交...

mojotv.cn

447 声望
33 粉丝
0 条评论
推荐阅读
Go语言详解:HTTP断点续传多线程下载原理
原文地址:Go语言详解:HTTP断点续传多线程下载原理

mojotv_cn阅读 2.1k

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin23阅读 3.3k评论 6

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀24阅读 58.3k评论 2

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100216阅读 11.6k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100215阅读 12k评论 4

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.7k

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

mojotv.cn

447 声望
33 粉丝
宣传栏