beego框架(golang)学习验证码
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)学习验证码的更多相关文章
- beego框架(golang)学习过滤器(实现restful请求)
过滤器 在用beego做restful路由的时候,遇到了除了GTE.POST之外的HTTP请求,比如 PUT.PATCH.delete请求无法通过路由认证,报错误:405 METHOD NOT ALL ...
- golang学习之beego框架配合easyui实现增删改查及图片上传
golang学习之beego框架配合easyui实现增删改查及图片上传 demo目录: upload文件夹主要放置上传的头像文件,main是主文件,所有效果如下: 主页面: 具体代码: <!DO ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web
golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- golang学习笔记7 使用beego swagger 实现API自动化文档
golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...
- go语言,golang学习笔记4 用beego跑一个web应用
go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...
- go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量
go语言,golang学习笔记3 用命令下载框架报错问题解决 设置环境变量 下载安装:go get github.com/astaxie/beego 首页 - beego: 简约 & 强大并存 ...
- go语言,golang学习笔记2 web框架选择
go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...
随机推荐
- CF19D Points 平衡树
题意:支持插入/删除点 $(x,y)$,查询一个点右上方横坐标与之最接近的点坐标. 我们可以对于每一个操作过的横坐标都开一个 $set$,然后再开一个平衡树,维护每个横坐标上最大的纵坐标. 然后查询点 ...
- Intel 8086 CPU
一.8086概述 Intel8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标).资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配 ...
- LIO -SCSI target
2010年底,LIO 项目获选成为新的内核态的 SCSI target,取代原有的用户态的 STGT 项目.当时有两个主要的竞争项目(LIO和SCST),都在努力将代码并入主线内核.本文将比较着两个项 ...
- 力扣50题 Pow(x,n)
本题是力扣网第50题. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 采用递归和非递归思路python实现. class Solution: #递归思路 def myPow_recurs ...
- python中isinstance函数
1.描述 python中isinstance()函数,是python中的一个内置函数,用来判断一个函数是否是一个已知的类型,类似type(). 2.语法 isinstance(object,class ...
- 前端项目, 每次运行都需要输入 sudo 的解决方法
前端项目, 每次运行都需要输入 sudo 的解决方法 node一直提示的sudo问题根本原因为: node 的所有者, 项目的所有者, 不同; 解决方法为: 将项目的所有者更改为 chown -R ` ...
- 模板 - 数据结构 - 栈/Stack
普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...
- CF1163F Indecisive Taxi Fee(线段树+图论)
做法 这里的修改是暂时的 找到一条最短路径\(E\),需要考虑的是将最短路径上的边增大 每个点考虑与\(1/n\)的最短路径在E上前缀/后缀的位置,设\(L_i,R_i\) 考虑每条边\((u,v)\ ...
- Hadoop hadoop 之hdfs数据块修复方法
hadoop 之hdfs数据块修复方法: .手动修复 hdfs fsck / #检查集群的健康状态 hdfs debug recoverLease -path 文件位置 -retries 重试次数 # ...
- 给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2. 递归使用 参考答案 ...