• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang Http 验证码示例实现

     验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分 计算机 和人类的 图灵测试 )的缩写,是一种区分用户是计算机还是人的公共全自动 程序 。可以防止:恶意破解密码、 刷票 、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

    传统网站验证码工作机制

    由于服务器生成的验证码值从始至终均未返回给客户端,因此,客户端只能从图片中识别验证码字符串,从而保证人机校验逻辑。

    Go的HTTP验证码

    思路

    Go 语言的 HTTP 服务器默认不支持 Session,因此验证码值需要换个思路存储,以下是不使用 Session 的逻辑

    示例

    安装验证码依赖

    github.com/dchest/captcha

    代码实现

    package main
      
      import (
        "fmt"
        "github.com/dchest/captcha"
        "log"
        "net/http"
      )
      
      func main() {
        // 获取验证码 ID
        http.HandleFunc("/captcha/generate", func(w http.ResponseWriter, r *http.Request) {
          id := captcha.NewLen(6)
          if _, err := fmt.Fprint(w, id); err != nil {
            log.Println("generate captcha error", err)
          }
        })
        // 获取验证码图片
        http.HandleFunc("/captcha/image", func(w http.ResponseWriter, r *http.Request) {
          id := r.URL.Query().Get("id")
          if id == "" {
            http.Error(w, "Bad Request", http.StatusBadRequest)
            return
          }
          w.Header().Set("Content-Type", "image/png")
          if err := captcha.WriteImage(w, id, 120, 80); err != nil {
            log.Println("show captcha error", err)
          }
        })
        // 业务处理
        http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) {
          if err := r.ParseForm(); err != nil {
            log.Println("parseForm error", err)
            http.Error(w, "Internal Error", http.StatusInternalServerError)
            return
          }
          // 获取验证码 ID 和验证码值
          id := r.FormValue("id")
          value := r.FormValue("value")
          // 比对提交的验证码值和内存中的验证码值
          if captcha.VerifyString(id, value) {
            fmt.Fprint(w, "ok")
          } else {
            fmt.Fprint(w, "mismatch")
          }
        })
        log.Fatal(http.ListenAndServe(":8080", nil))
      }
    

    运行

    项目地址

    https://github.com/xialeistudio/go-http-captcha-example

    到此这篇关于Golang Http 验证码示例实现的文章就介绍到这了,更多相关Golang Http 验证码 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 解决golang http重定向失效的问题
    • Golang发送http GET请求的示例代码
    • 详解golang开发中http请求redirect的问题
    • golang常用库之gorilla/mux-http路由库使用详解
    • 详解Golang开启http服务的三种方式
    • 解决golang读取http的body时遇到的坑
    上一篇:详解Go多协程并发环境下的错误处理
    下一篇:谈谈对Golang IO读写的困惑
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Golang Http 验证码示例实现 Golang,Http,验证,码,示例,