欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

Go的HTTP驗(yàn)證碼

思路

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

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

示例

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

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)行

  • 訪問/captcha/generate獲得驗(yàn)證碼 ID
  • 訪問/captcha/image?id=驗(yàn)證碼 ID
  • 訪問/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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go 壓縮解壓zip文件源碼示例

    go 壓縮解壓zip文件源碼示例

    這篇文章主要為大家介紹了go壓縮及解壓zip文件的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • golang常用庫(kù)之操作數(shù)據(jù)庫(kù)的orm框架-gorm基本使用詳解

    golang常用庫(kù)之操作數(shù)據(jù)庫(kù)的orm框架-gorm基本使用詳解

    這篇文章主要介紹了golang常用庫(kù)之操作數(shù)據(jù)庫(kù)的orm框架-gorm基本使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Golang學(xué)習(xí)之無類型常量詳解

    Golang學(xué)習(xí)之無類型常量詳解

    對(duì)于無類型常量,可能大家是第一次聽說,但我們每天都在用,每天都有無數(shù)潛在的坑被埋下。本文就來和大家聊聊它的相關(guān)注意事項(xiàng)吧,希望對(duì)大家有所幫助
    2023-03-03
  • Golang兩行代碼實(shí)現(xiàn)發(fā)送釘釘機(jī)器人消息

    Golang兩行代碼實(shí)現(xiàn)發(fā)送釘釘機(jī)器人消息

    創(chuàng)建一個(gè)釘釘機(jī)器人必須使用加簽,本文通過Golang兩行代碼實(shí)現(xiàn)發(fā)送釘釘機(jī)器人消息,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • go語言中for?range使用方法及避坑指南

    go語言中for?range使用方法及避坑指南

    Go中的for range組合可以和方便的實(shí)現(xiàn)對(duì)一個(gè)數(shù)組或切片進(jìn)行遍歷,但是在某些情況下使用for range時(shí)很可能就會(huì)被"坑",下面這篇文章主要給大家介紹了關(guān)于go語言中for?range使用方法及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Golang之模糊測(cè)試工具的使用

    Golang之模糊測(cè)試工具的使用

    本文主要介紹了Golang之模糊測(cè)試工具的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 使用Golang的Context管理上下文的方法

    使用Golang的Context管理上下文的方法

    這篇文章主要介紹了使用Golang的Context管理上下文的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Go語言中的字符串拼接方法詳情

    Go語言中的字符串拼接方法詳情

    本文介紹Go語言中的string類型、strings包和bytes.Buffer類型,介紹幾種字符串拼接方法的相關(guān)資料,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-10-10
  • 深入解析Golang中JSON的編碼與解碼

    深入解析Golang中JSON的編碼與解碼

    隨著互聯(lián)網(wǎng)的快速發(fā)展和數(shù)據(jù)交換的廣泛應(yīng)用,各種數(shù)據(jù)格式的處理成為軟件開發(fā)中的關(guān)鍵問題,本文將介紹?Golang?中?JSON?編碼與解碼的相關(guān)知識(shí),幫助大家了解其基本原理和高效應(yīng)用,需要的可以收藏一下
    2023-05-05
  • 淺析Golang中Gin框架存在的必要性

    淺析Golang中Gin框架存在的必要性

    在Go語言中,net/http?包提供了一個(gè)強(qiáng)大且靈活的標(biāo)準(zhǔn)HTTP庫(kù),那為什么還出現(xiàn)了像?Gin?這樣的,方便我們構(gòu)建Web應(yīng)用程序的第三方庫(kù),下面就來和大家簡(jiǎn)單分析一下
    2023-08-08

最新評(píng)論