首页 > 其他分享 >go验证码的使用

go验证码的使用

时间:2023-04-12 23:12:12浏览次数:34  
标签:index base64Captcha nil err 验证码 使用 go http

前言:

go验证码演示地址: https://captcha.mojotv.cn/

正文:

验证码包下载

go version > 1.11

go get -u github.com/mojocn/base64Captcha

 

验证码展示到页面示例:

使用go net http包显示验证码

 

import (
    "encoding/json"
    "github.com/mojocn/base64Captcha"
    "html/template"
    "image/color"
    "log"
    "net/http"
)
var store = base64Captcha.DefaultMemStore
// 获取验证码
func getCaptcha(w http.ResponseWriter, r *http.Request) {
    //配置验证码
    driverString := base64Captcha.DriverString{
        Height:          60,
        Width:           200,
        NoiseCount:      0,     //噪点数
        ShowLineOptions: 2 | 4, //干扰线
        Length:          4,
        Source:          "123456789ABCDEFGHIJKLHIJKLMNOPQRSTUVWXYZ",
        BgColor: &color.RGBA{
            R: 10,
            G: 20,
            B: 50,
            A: 10,
        },
        Fonts: []string{"wqy-microhei.ttc"},
    }

    var driver base64Captcha.Driver = driverString.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    if err != nil {
        body = map[string]interface{}{"code": 0, "msg": err.Error()}
    }
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 展示页面
func index(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("view/index.html")
    if err != nil {
        log.Fatal("err:", err.Error())
    }
    t.Execute(w, nil)
}

func main() {
    http.HandleFunc("/index", index)
    http.HandleFunc("/api/getCaptcha", getCaptcha)
    //运行http服务
    http.ListenAndServe(":8080", nil)
}

 

view/index.html页面

 

<h3>验证码</h3>
<p><img src="#" alt="验证码" id="img" onclick="showCaptcha()"></p>
<p><input type="text" placeholder="请输入验证码" name="captcha"> <input type="button" value="提交"></p>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.js"></script>
<script>
    function showCaptcha(){
        $.get("/api/getCaptcha",function (res){
            $("#img").attr("src",res.data)
        })
    }
    showCaptcha()
</script>

 

 

效果展示:

 

 

算术验证码和中文验证码示例:

import (
    "encoding/json"
    "github.com/mojocn/base64Captcha"
    "html/template"
    "image/color"
    "log"
    "net/http"
)
var store = base64Captcha.DefaultMemStore
// 获取验证码
func getCaptcha(w http.ResponseWriter, r *http.Request) {
    //配置验证码
    driverMath := base64Captcha.DriverMath{
        Height:          60,
        Width:           200,
        ShowLineOptions: 2 | 4, //干扰线
        BgColor: &color.RGBA{
            R: 10,
            G: 20,
            B: 50,
            A: 10,
        },
        Fonts: []string{"wqy-microhei.ttc"},
    }
    var driver base64Captcha.Driver = driverMath.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    if err != nil {
        body = map[string]interface{}{"code": 0, "msg": err.Error()}
    }
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 展示页面
func index(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("view/index.html")
    if err != nil {
        log.Fatal("err:", err.Error())
    }
    t.Execute(w, nil)
}

func main() {
    http.HandleFunc("/index", index)
    http.HandleFunc("/api/getCaptcha", getCaptcha)
    //运行http服务
    http.ListenAndServe(":8080", nil)
}

 

算术验证码效果展示:

 

 

 

中文验证码示例:

import (
    "encoding/json"
    "github.com/mojocn/base64Captcha"
    "html/template"
    "image/color"
    "log"
    "net/http"
)
var store = base64Captcha.DefaultMemStore
// 获取验证码
func getCaptcha(w http.ResponseWriter, r *http.Request) {

    driverChinese := base64Captcha.DriverChinese{
        Height:          60,
        Width:           200,
        ShowLineOptions: 2 | 4, //干扰线
        Source:          "大家啊第三方阿斯顿发的而且我和公司颠覆三观啊啊的发请求而且嘎达",
        Length:          3,
        BgColor: &color.RGBA{
            R: 10,
            G: 20,
            B: 50,
            A: 10,
        },
        Fonts: []string{"wqy-microhei.ttc"},
    }
    var driver base64Captcha.Driver = driverChinese.ConvertFonts()
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    if err != nil {
        body = map[string]interface{}{"code": 0, "msg": err.Error()}
    }
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 展示页面
func index(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("view/index.html")
    if err != nil {
        log.Fatal("err:", err.Error())
    }
    t.Execute(w, nil)
}

func main() {
    http.HandleFunc("/index", index)
    http.HandleFunc("/api/getCaptcha", getCaptcha)
    //运行http服务
    http.ListenAndServe(":8080", nil)
}

展示效果:

 

 

 

验证验证码输入是否正确示例:

需要注意,验证码,不论验证成功,或失败,都要重新刷新,这样确保验证码的安全效果。

var store = base64Captcha.DefaultMemStore
// 获取验证码
func getCaptcha(w http.ResponseWriter, r *http.Request) {


    var driver = &base64Captcha.DriverDigit{
        Height:   60,
        Width:    200,
        Length:   4,
        DotCount: 80,
    }
    //生成验证码
    c := base64Captcha.NewCaptcha(driver, store)
    id, b64s, err := c.Generate()
    body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}
    if err != nil {
        body = map[string]interface{}{"code": 0, "msg": err.Error()}
    }
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 验证码验证
func verifyCaptcha(w http.ResponseWriter, r *http.Request) {
    captcha := r.PostFormValue("captcha")
    captcha_id := r.PostFormValue("captcha_id")

    body := map[string]interface{}{"code": 0, "msg": "failed"}
    if store.Verify(captcha_id, captcha, true) {
        body = map[string]interface{}{"code": 1, "msg": "ok"}
    }
    //set json response
    w.Header().Set("Content-Type", "application/json; charset=utf-8")
    json.NewEncoder(w).Encode(body)
}

// 展示页面
func index(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("view/index.html")
    if err != nil {
        log.Fatal("err:", err.Error())
    }
    t.Execute(w, nil)
}

func main() {
    http.HandleFunc("/index", index)
    http.HandleFunc("/api/getCaptcha", getCaptcha)
    http.HandleFunc("/api/verifyCaptcha", verifyCaptcha)
    //运行http服务
    http.ListenAndServe(":8080", nil)
}

 

完结

 

标签:index,base64Captcha,nil,err,验证码,使用,go,http
From: https://www.cnblogs.com/ypeih/p/17311731.html

相关文章

  • go 单文件上传,多文件上传
    单文件上传示例: main.gorouter:=router.InitRouter()router.Run() router/router.govarrouter=gin.Default()funcinit(){//加载自定义函数ifv,ok:=binding.Validator.Engine().(*validator.Validate);ok{v.RegisterValidation("capt",......
  • mongoDB查询优化《一》
    同事反馈线上一个查询非常慢(10秒+),具体如下:1.问题语句db.myColl.find({app:"my_app",requestTime:{$gte:1492502247000,$lt:1492588800000}}).sort({_id:-1}).limit(1)表记录如下:{"app":"my_app","eventId":141761066,"requestTime":Numb......
  • Lecture#10 Sorting & Aggregation Algorithms
    接下来将学习使用我们现在学习的DBMS组件来执行查询。我们今天要讨论的算法都是基于Disk的,即查询的中间结果也需要存储到磁盘中。我们需要使用BufferPool去实现这些算法,要最大化磁盘连续I/O。QueryPlan:算子组织成树形结构,数据从叶子节点流向根节点,根节点的输出就是查......
  • Golang一日一库之 日志库 zap
    简介在开发过程中会使用到日志库去记录错误的日志,尤其是golang中有无穷无尽的error如果不记录,当你的代码出错,就无从排错了。zap是开源的Go高性能日志库主要有以下特点:支持不同的日志级别能够打印基本信息等但不支持日志的分割但是可以使用lumberjack也是zap官方......
  • ssh的基础使用与端口转发
    基础使用基本连接SSH基本的连接命令是:sshusername@hostname这里牵扯到了两台主机执行命令、运行SSH客户端的主机,我们称为本地主机A【HostA】;接收连接请求、运行SSH服务器的主机,我们称为远程主机B【HostB】。通过密码或密钥等方式验证后,SSH连接建立,主机A可以使用命令......
  • NumPy 秘籍中文第二版:九、使用 Cython 加速代码
    原文:NumPyCookbook-SecondEdition协议:CCBY-NC-SA4.0译者:飞龙在本章中,我们将介绍以下秘籍:安装Cython构建HelloWorld程序将Cython与NumPy结合使用调用C函数分析Cython代码用Cython近似阶乘简介Cython是基于Python的相对年轻的编程语言。它允......
  • Go sync.Once:简约而不简单的并发利器
    原创文章,如需转载请联系作者:陈明勇公众号:Go技术干货简介在某些场景下,我们需要初始化一些资源,例如单例对象、配置等。实现资源的初始化有多种方法,如定义package级别的变量、在init函数中进行初始化,或者在main函数中进行初始化。这三种方式都能确保并发安全,并在程序启动......
  • Git是什么?可以用来做什么?如何使用?
    在学习小程序的相关知识和时,他提供了一个git管理代码,使用相关的命令来进行操作的,然后我的电脑并不识别该命令,所以搜索了一下Git具体是什么,详细请看下面的讲解:git用来干什么?不知道你工作的时候有没有遇到这样的情况:比如说,做BIM建模,你手中有一份模型初稿,但现在需要在上面进行修改......
  • threading多线程使用
    当我们调用某段代码时需要等待一段时间后才能进行后续的操作,而这期间计算资源并未占满,这就浪费了CPU的资源和时间,此时可以采用多线程进行并行计算。如当我们使用爬虫爬取网络资源时,某个资源的爬取过程由于网络因素需要等待,而后续的资源清洗和整合等需要等待,此时可以将资源分多份......
  • 别名的使用场景
    SQL语句可以为表名称或列名称指定别名。(别名有时也称为导出列,不管是导出列还是别名,它们所代表的都是相同的东西。)SQL别名SQL别名用于为表或表中的列提供临时名称。SQL别名通常用于使表名或列名更具可读性。SQL一个别名只存在于查询期间。别名使用AS关键字赋......