中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Golang的Http驗證碼

發布時間:2021-02-26 09:21:44 來源:億速云 閱讀:254 作者:清風 欄目:編程語言

本文將為大家詳細介紹“如何實現Golang的Http驗證碼”,內容步驟清晰詳細,細節處理妥當,而小編每天都會更新不同的知識點,希望這篇“如何實現Golang的Http驗證碼”能夠給你意想不到的收獲,請大家跟著小編的思路慢慢深入,具體內容如下,一起去收獲新知識吧。

golang的優點有哪些

golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。

Golang Http 驗證碼示例

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

傳統網站驗證碼工作機制

  • 客戶端請求服務器獲取驗證碼圖片

  • 服務器生成隨機串(驗證碼值)寫入Session,并將驗證碼值寫入到圖片中返回給客戶端

  • 客戶端輸入圖片上的字符串提交給服務器驗證

  • 服務器比對客戶端提交的字符串值和 Session 中是否匹配,如果匹配則通過驗證

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

Go的HTTP驗證碼

思路

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

  • 客戶端請求服務器獲取驗證碼ID

  • 服務器生成驗證碼 ID,并生成驗證碼值,將 ID 和值的映射關系記錄到內存或緩存,并將 ID 返回給客戶端

  • 客戶端根據返回的 ID 請求服務器獲取驗證碼圖片

  • 服務器獲取到驗證碼 ID,從內存或緩存中取出驗證碼值,將該值寫入圖片并將圖片返回給客戶端

  • 客戶端提交驗證碼 ID(第1步獲得)和驗證碼值給服務器驗證

  • 服務器獲取驗證碼 ID,從內存或緩存中取出驗證碼值與客戶端提交的驗證碼值比對

示例

  1. 安裝驗證碼依賴

github.com/dchest/captcha
  1. 代碼實現

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))
   }
  1. 運行

    1. 訪問/captcha/generate獲得驗證碼 ID

    2. 訪問/captcha/image?id=驗證碼 ID

    3. 訪問/login,并輸入第一步的驗證碼 ID 和第二步的驗證碼值即可查看驗證結果

如果你能讀到這里,小編希望你對“如何實現Golang的Http驗證碼”這一關鍵問題有了從實踐層面最深刻的體會,具體使用情況還需要大家自己動手實踐使用過才能領會,如果想閱讀更多相關內容的文章,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玛纳斯县| 淳安县| 富阳市| 祁阳县| 玉林市| 菏泽市| 禹州市| 大田县| 庆元县| 怀安县| 甘谷县| 英山县| 饶阳县| 平凉市| 根河市| 商城县| 巴楚县| 闽清县| 海淀区| 庐江县| 筠连县| 丹凤县| 保亭| 苍南县| 周宁县| 红原县| 墨玉县| 五原县| 克拉玛依市| 佛学| SHOW| 德钦县| 西和县| 安康市| 喜德县| 四川省| 修武县| 海兴县| 麻栗坡县| 扶沟县| 观塘区|