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

Golang Http 驗證碼示例實現

 更新時間:2020年08月21日 08:22:34   作者:xialeistudio  
這篇文章主要介紹了Golang Http 驗證碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

 驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分 計算機 和人類的 圖靈測試 )的縮寫,是一種區(qū)分用戶是計算機還是人的公共全自動 程序 。可以防止:惡意破解密碼、 刷票 、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式,我們利用比較簡易的方式實現了這個功能。這個問題可以由計算機生成并評判,但是必須只有人類才能解答。由于計算機無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認為是人類。

傳統網站驗證碼工作機制

  • 客戶端請求服務器獲取驗證碼圖片
  • 服務器生成隨機串(驗證碼值)寫入Session,并將驗證碼值寫入到圖片中返回給客戶端
  • 客戶端輸入圖片上的字符串提交給服務器驗證
  • 服務器比對客戶端提交的字符串值和 Session 中是否匹配,如果匹配則通過驗證

由于服務器生成的驗證碼值從始至終均未返回給客戶端,因此,客戶端只能從圖片中識別驗證碼字符串,從而保證人機校驗邏輯。

Go的HTTP驗證碼

思路

Go 語言的 HTTP 服務器默認不支持 Session,因此驗證碼值需要換個思路存儲,以下是不使用 Session 的邏輯

  • 客戶端請求服務器獲取驗證碼ID
  • 服務器生成驗證碼 ID,并生成驗證碼值,將 ID 和值的映射關系記錄到內存或緩存,并將 ID 返回給客戶端
  • 客戶端根據返回的 ID 請求服務器獲取驗證碼圖片
  • 服務器獲取到驗證碼 ID,從內存或緩存中取出驗證碼值,將該值寫入圖片并將圖片返回給客戶端
  • 客戶端提交驗證碼 ID(第1步獲得)和驗證碼值給服務器驗證
  • 服務器獲取驗證碼 ID,從內存或緩存中取出驗證碼值與客戶端提交的驗證碼值比對

示例

安裝驗證碼依賴

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)
      }
    })
    // 業(yè)務處理
    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))
  }

運行

  • 訪問/captcha/generate獲得驗證碼 ID
  • 訪問/captcha/image?id=驗證碼 ID
  • 訪問/login,并輸入第一步的驗證碼 ID 和第二步的驗證碼值即可查看驗證結果

項目地址

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

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

相關文章

  • go讀取request.Body內容踩坑實戰(zhàn)記錄

    go讀取request.Body內容踩坑實戰(zhàn)記錄

    很多初學者在使用Go語言進行Web開發(fā)時,都會遇到讀取 request.Body內容的問題,這篇文章主要給大家介紹了關于go讀取request.Body內容踩坑實戰(zhàn)記錄的相關資料,需要的朋友可以參考下
    2023-11-11
  • 深入剖析Go語言中的Select語句

    深入剖析Go語言中的Select語句

    select是Go中的一個控制結構,類似于switch語句,本文主要介紹了深入剖析Go語言中的Select語句,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Go語言報錯:'godoc'?不是內部或外部命令,也不是可運行的程序(godoc無法使用處理)解決方法

    Go語言報錯:'godoc'?不是內部或外部命令,也不是可運行的程序(godoc無法使用處理)解決

    這篇文章主要介紹了Go語言報錯:'godoc'?不是內部或外部命令,也不是可運行的程序(godoc無法使用處理)解決方法,詳細描述了Go語言godoc命令無法使用的原因、解決方法與相關注意事項,需要的朋友可以參考下
    2024-01-01
  • Golang測試func?TestXX(t?*testing.T)的使用詳解

    Golang測試func?TestXX(t?*testing.T)的使用詳解

    一般Golang中的測試代碼都以xxx_test.go的樣式,在命名測試函數的時候以Testxx開頭,下面給大家介紹Golang測試func?TestXX(t?*testing.T)的使用,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • golang?日志庫ZAP[uber-go?zap]示例詳解

    golang?日志庫ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開源的高性能Go語言日志庫,支持多種日志級別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結合lumberjack進行日志切割,實現日志按文件大小、時間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • golang使用redis實現全文搜索功能詳解

    golang使用redis實現全文搜索功能詳解

    這篇文章主要為大家詳細介紹了golang如何使用redis實現全文搜索功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-02-02
  • 8個Elasticsearch高頻面試題和答案整理

    8個Elasticsearch高頻面試題和答案整理

    這篇文章為大家精選了8道Elasticsearch高頻面試題和答案,并且給出了這些知識點的應用場景、也給出了解決這些問題的思路,希望對大家有所幫助
    2023-06-06
  • 淺析golang開發(fā)Error的使用詳解

    淺析golang開發(fā)Error的使用詳解

    Error是Go語言開發(fā)中最基礎也是最重要的部分,很多朋友不明白goland error的一些基本使用方法,今天通過本文給大家詳細介紹下,需要的朋友參考下吧
    2021-07-07
  • go-zero自定義中間件的幾種方式

    go-zero自定義中間件的幾種方式

    首先 go-zero 已經為我們提供了很多的中間件的實現,但有時難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-07-07
  • Golang 定時器的終止與重置實現

    Golang 定時器的終止與重置實現

    在實際開發(fā)過程中,我們有時候需要編寫一些定時任務。很多人都熟悉定時器的使用,那么定時器應該如何終止與重置,下面我們就一起來了解一下
    2021-08-08

最新評論

古交市| 烟台市| 通州区| 越西县| 滨州市| 西峡县| 敦化市| 中西区| 吉林省| 保德县| 永济市| 灌南县| 富阳市| 灵石县| 嘉善县| 牡丹江市| 绍兴市| 高密市| 万源市| 海原县| 瑞丽市| 阿勒泰市| 怀安县| 延津县| 德令哈市| 盘山县| 宜州市| 偃师市| 萍乡市| 和平区| 沾益县| 信丰县| 浪卡子县| 屏东市| 天全县| 富顺县| 乐平市| 平泉县| 宁陵县| 双鸭山市| 霸州市|