beego框架(golang)學習驗證碼

beego框架(golang)學習驗證碼

登陸頁面使用驗證碼

路由設置

/beego_admin_template/routers/router.gohtml

get請求頁面, post驗證用戶名密碼和驗證碼git

beego.Router("/login", &admin.CommonController{}, 
    "get:LoginPage;post:Login")

當url輸入 http://localhost:8080/login 時跳轉到登陸頁面,顯示驗證碼github

控制器目錄

/beego_admin_template/controllers/admin/common.gogolang

package admin
import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/cache"
    captcha2 "github.com/astaxie/beego/utils/captcha"
)

// 全局驗證碼結構體
var captcha *captcha2.Captcha

// init函數初始化captcha
func init()  {
    // 驗證碼功能
    // 使用Beego緩存存儲驗證碼數據
    store := cache.NewMemoryCache()
    // 建立驗證碼
    captcha = captcha2.NewWithFilter("/captcha", store)
    // 設置驗證碼長度
    captcha.ChallengeNums = 4
    // 設置驗證碼模板高度
    captcha.StdHeight = 50
    // 設置驗證碼模板寬度
    captcha.StdWidth = 120
}

// 登陸頁面
func (c *CommonController)LoginPage()  {
    // 設置模板目錄
    c.TplName = "admin/common/login.html"
}

登陸頁面

/beego_admin_template/views/admin/common/login.html緩存

<div style="margin-left: 10px;">
    {{create_captcha}}
</div>

驗證驗證碼

// 登陸
func (c *CommonController)Login()  {
    // 驗證碼驗證
    if !captcha.VerifyReq(c.Ctx.Request) {
        c.Data["Error"] = "驗證碼錯誤"
        return
    }

    // 其餘代碼
    …… 

    c.Redirect("/", 302)
}

captcha.go
// VerifyReq verify from a request
func (c *Captcha) VerifyReq(req *http.Request) bool {
    // 解析請求體
    req.ParseForm()
    // 讀取請求參數調用Verify方法
    return c.Verify(req.Form.Get(c.FieldIDName), req.Form.Get(c.FieldCaptchaName))
}

// 驗證驗證碼id和字符串
func (c *Captcha) Verify(id string, challenge string) (success bool) {
    if len(challenge) == 0 || len(id) == 0 {
        return
    }

    var chars []byte

    key := c.key(id)

    if v, ok := c.store.Get(key).([]byte); ok {
        chars = v
    } else {
        return
    }

    defer func() {
        // finally remove it
        c.store.Delete(key)
    }()

    if len(chars) != len(challenge) {
        return
    }
    // verify challenge
    for i, c := range chars {
        if c != challenge[i]-48 {
            return
        }
    }

    return true
}

注意點

在調試驗證碼的時候,會發現驗證碼總是錯誤,是由於默認驗證碼是存儲在內存中,每次重啓會刪除內存框架

源碼查看

文件:common.go函數

調用緩存包中的NewMemoryCache()函數,返回一個新的內存緩存指針地址

store := cache.NewMemoryCache()

文件:memory.gopost

MemoryCache是一個內存緩存適配器,它包含一個map帶有讀寫鎖的map存儲

// MemoryCache is Memory cache adapter.
// it contains a RW locker for safe map storage.
type MemoryCache struct {
    sync.RWMutex
    dur   time.Duration
    items map[string]*MemoryItem
    Every int // run an expiration check Every clock time
}



// NewMemoryCache returns a new MemoryCache.
func NewMemoryCache() Cache {
    cache := MemoryCache{items: make(map[string]*MemoryItem)}
    return &cache
}

文件:common.go學習

NewWithFilter()方法建立一個新的驗證碼,並返回該驗證碼的指針url

captcha = captcha2.NewWithFilter("/captcha", store)

文件 captcha.go

// 該方法建立了一個驗證碼在指定緩存中
// 增長了一個服務於驗證碼圖片的過濾器
// 而且添加了一個用於輸出html的模板函數

func NewWithFilter(urlPrefix string, store cache.Cache) *Captcha {
    // 生成驗證碼結構體
    cpt := NewCaptcha(urlPrefix, store)

    // 建立過濾器
    beego.InsertFilter(cpt.URLPrefix+"*", beego.BeforeRouter, cpt.Handler)

    // add to template func map
    beego.AddFuncMap("create_captcha", cpt.CreateCaptchaHTML)

    return cpt
}

其實 cpt.Handler須要好好看一下,裏面包含了beego過濾器的使用

相關文章
相關標籤/搜索