beego框架(golang)学习验证码

登录页面使用验证码

路由设置

/beego_admin_template/routers/router.go

get请求页面, post验证用户名密码和验证码

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

当url输入 http://localhost:8080/login 时跳转到登录页面,显示验证码

控制器目录

/beego_admin_template/controllers/admin/common.go

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.go

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()方法创建一个新的验证码,并返回该验证码的指针

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过滤器的使用

beego框架(golang)学习验证码的更多相关文章

  1. beego框架(golang)学习过滤器(实现restful请求)

    过滤器 在用beego做restful路由的时候,遇到了除了GTE.POST之外的HTTP请求,比如 PUT.PATCH.delete请求无法通过路由认证,报错误:405 METHOD NOT ALL ...

  2. golang学习之beego框架配合easyui实现增删改查及图片上传

    golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...

  3. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  4. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  5. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  6. golang学习笔记7 使用beego swagger 实现API自动化文档

    golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...

  7. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  8. go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量

    go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...

  9. go语言,golang学习笔记2 web框架选择

    go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...

随机推荐

  1. learning java ProcessHandle 获取进程相当信息

    Process p = rt.exec("notepad.exe"); ProcessHandle ph = p.toHandle(); System.out.println(&q ...

  2. 那些被Oracle优化的程序员

    甲骨文(中国)是一家很有趣的公司,势头强劲,却被公认为养老公司(俗称西二旗养老院).风光无限,却也走上了裁员之路. 据甲骨文员工透漏,前一天晚上还在加班改bug,第二天就通知被裁了,甚至要求被裁员工在 ...

  3. 推荐VSCode多语言开发,支持一键JAVA

    本文梯子 缘起 一.VSCode 开发 NetCore 0.安装 VSCode IDE 1.安装依赖扩展 2.新建一个项目 3.打开已有工程 4.总结 二.VSCode 开发 Vue 1.安装插件 2 ...

  4. golang-os文件操作

    golang-os文件操作 package main import ( "fmt" "os" ) //func main() { // f,err :=os.C ...

  5. golang orm

    package main import ( "fmt" "github.com/astaxie/beego/orm" _"github.com/go- ...

  6. 贪心算法训练(九)——Best Cow Line(字典序最小问题)

    原题链接:Best Cow Line 1. 问题描述 2. 输入 6 A C D B C B 3. 输出 ABCBCD 4.思路分析 不断地取原字符串 S 中开头和末尾比较小的字符串放到 T 的末尾 ...

  7. JSP迭代标签

    1. 新建LoopTag类,代码如下: package bid.zhazhapan.fims.tag; import java.io.IOException; import java.util.Col ...

  8. python3 之metaclass

    如果希望创建某一批类全部具有某种特征,则可通过 metaclass 来实现.使用 metaclass 可以在创建类时动态修改类定义. 为了使用 metaclass 动态修改类定义,程序需要先定义 me ...

  9. 页面中的radio选择适合的非空判断

     var cyjb=$('input:radio[name="jcrwModel.cyjb"]:checked').val();                if(cyjb==n ...

  10. boosting与随机森林

      本文原创,转载请注明出处 http://www.cnblogs.com/gufeiyang 本文主要分两部分,boosting 与 随机森林. “三个臭皮匠顶一个诸葛亮”是说三个不聪明的人集合在一 ...