主頁(yè) > 知識(shí)庫(kù) > Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)

Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)

熱門(mén)標(biāo)簽:呼叫中心市場(chǎng)需求 Linux服務(wù)器 鐵路電話(huà)系統(tǒng) 百度競(jìng)價(jià)排名 服務(wù)外包 地方門(mén)戶(hù)網(wǎng)站 AI電銷(xiāo) 網(wǎng)站排名優(yōu)化

 驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分 計(jì)算機(jī) 和人類(lèi)的 圖靈測(cè)試 )的縮寫(xiě),是一種區(qū)分用戶(hù)是計(jì)算機(jī)還是人的公共全自動(dòng) 程序 ??梢苑乐梗簮阂馄平饷艽a、 刷票 、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶(hù)用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,實(shí)際上用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式,我們利用比較簡(jiǎn)易的方式實(shí)現(xiàn)了這個(gè)功能。這個(gè)問(wèn)題可以由計(jì)算機(jī)生成并評(píng)判,但是必須只有人類(lèi)才能解答。由于計(jì)算機(jī)無(wú)法解答CAPTCHA的問(wèn)題,所以回答出問(wèn)題的用戶(hù)就可以被認(rèn)為是人類(lèi)。

傳統(tǒng)網(wǎng)站驗(yàn)證碼工作機(jī)制

  • 客戶(hù)端請(qǐng)求服務(wù)器獲取驗(yàn)證碼圖片
  • 服務(wù)器生成隨機(jī)串(驗(yàn)證碼值)寫(xiě)入Session,并將驗(yàn)證碼值寫(xiě)入到圖片中返回給客戶(hù)端
  • 客戶(hù)端輸入圖片上的字符串提交給服務(wù)器驗(yàn)證
  • 服務(wù)器比對(duì)客戶(hù)端提交的字符串值和 Session 中是否匹配,如果匹配則通過(guò)驗(yàn)證

由于服務(wù)器生成的驗(yàn)證碼值從始至終均未返回給客戶(hù)端,因此,客戶(hù)端只能從圖片中識(shí)別驗(yàn)證碼字符串,從而保證人機(jī)校驗(yàn)邏輯。

Go的HTTP驗(yàn)證碼

思路

Go 語(yǔ)言的 HTTP 服務(wù)器默認(rèn)不支持 Session,因此驗(yàn)證碼值需要換個(gè)思路存儲(chǔ),以下是不使用 Session 的邏輯

  • 客戶(hù)端請(qǐng)求服務(wù)器獲取驗(yàn)證碼ID
  • 服務(wù)器生成驗(yàn)證碼 ID,并生成驗(yàn)證碼值,將 ID 和值的映射關(guān)系記錄到內(nèi)存或緩存,并將 ID 返回給客戶(hù)端
  • 客戶(hù)端根據(jù)返回的 ID 請(qǐng)求服務(wù)器獲取驗(yàn)證碼圖片
  • 服務(wù)器獲取到驗(yàn)證碼 ID,從內(nèi)存或緩存中取出驗(yàn)證碼值,將該值寫(xiě)入圖片并將圖片返回給客戶(hù)端
  • 客戶(hù)端提交驗(yàn)證碼 ID(第1步獲得)和驗(yàn)證碼值給服務(wù)器驗(yàn)證
  • 服務(wù)器獲取驗(yàn)證碼 ID,從內(nèi)存或緩存中取出驗(yàn)證碼值與客戶(hù)端提交的驗(yàn)證碼值比對(duì)

示例

安裝驗(yàn)證碼依賴(lài)

github.com/dchest/captcha

代碼實(shí)現(xiàn)

package main
  
  import (
    "fmt"
    "github.com/dchest/captcha"
    "log"
    "net/http"
  )
  
  func main() {
    // 獲取驗(yàn)證碼 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)
      }
    })
    // 獲取驗(yàn)證碼圖片
    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)
      }
    })
    // 業(yè)務(wù)處理
    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
      }
      // 獲取驗(yàn)證碼 ID 和驗(yàn)證碼值
      id := r.FormValue("id")
      value := r.FormValue("value")
      // 比對(duì)提交的驗(yàn)證碼值和內(nèi)存中的驗(yàn)證碼值
      if captcha.VerifyString(id, value) {
        fmt.Fprint(w, "ok")
      } else {
        fmt.Fprint(w, "mismatch")
      }
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
  }

運(yùn)行

  • 訪問(wèn)/captcha/generate獲得驗(yàn)證碼 ID
  • 訪問(wèn)/captcha/image?id=驗(yàn)證碼 ID
  • 訪問(wèn)/login,并輸入第一步的驗(yàn)證碼 ID 和第二步的驗(yàn)證碼值即可查看驗(yàn)證結(jié)果

項(xiàng)目地址

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

到此這篇關(guān)于Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang Http 驗(yàn)證碼 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決golang http重定向失效的問(wèn)題
  • Golang發(fā)送http GET請(qǐng)求的示例代碼
  • 詳解golang開(kāi)發(fā)中http請(qǐng)求redirect的問(wèn)題
  • golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解
  • 詳解Golang開(kāi)啟http服務(wù)的三種方式
  • 解決golang讀取http的body時(shí)遇到的坑

標(biāo)簽:湘潭 崇左 蘭州 黃山 仙桃 銅川 衡水 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang Http 驗(yàn)證碼示例實(shí)現(xiàn)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266