WORM拦截器
WORM拦截器是一个action(处理器函数)之前或之后被调用的函数,通常用于处理一些公共逻辑。拦截器能够用于以下常见问题:
- 请求日志记录
- 错误处理
- 身份验证处理
- before_exec :执行action之前拦截器
- after_exec :执行action之后拦截器
main函数
package main
import (
"demo/handler"
"github.com/haming123/wego"
log "github.com/haming123/wego/dlog"
)
func main() {
web, err := wego.InitWeb()
if err != nil {
log.Error(err)
return
}wego.SetDebugLogLevel(wego.LOG_DEBUG)
web.Config.SessionParam.SessionOn = true
web.Config.SessionParam.HashKey = "demohash"web.BeforExec(handler.BeforeExec)
web.GET("/login_get", handler.HandlerLoginGet).SkipHook()
web.POST("/login_post", handler.HandlerLoginPost).SkipHook()
web.GET("/index", handler.HandlerIndex)err = web.Run("0.0.0.0:8080")
if err != nil {
log.Error(err)
}
}
说明:
- 本例子中使用基于cookie的session数据存储引擎,用于存储用户登录账号。
- 调用
web.BeforExec(handler.BeforeExec)
来设置拦截器,在handler.BeforeExec
拦截器中实现了登录状态的检查逻辑。 - 由于login_get页面、login_post页面不需要进行登录检验,使用
SkipHook()
来忽略拦截器。
func HandlerLoginGet(c *wego.WebContext) {
c.WriteHTML(http.StatusOK, "./view/login.html", nil)
}
【Go语言WEB框架使用说明(使用拦截器验证用户的登录状态)】login.html的内容如下:
登录页面 - 锐客网
用户登陆
用户点击"立即登录"后项服务器发送post请求到login_post, login_post处理器的实现如下:
func HandlerLoginPost(c *wego.WebContext) {
account := c.Param.MustString("account")
password := c.Param.MustString("password")
if account == "admin" && password == "demo" {
c.Session.Set("account", account)
c.Session.Save()
c.Redirect(302, "/index")
} else {
c.Session.Set("account", "")
c.Session.Save()
c.Redirect(302, "/login_get")
}
}
说明:
- 在HandlerLoginPost调用c.Session.Set将账号写入session。
func GetAccount(c *wego.WebContext) string {
account, _ := c.Session.GetString("account")
return account
}
func BeforeExec(c *wego.WebContext) {
login_path := "/login_get"
if GetAccount(c) == "" && c.Path != login_path {
c.Redirect(302, login_path)
return
}
}
说明:
- 实现GetAccount函数来获取session数据,若用户成功登录了系统,则session中保存有用户的登录账号。在处理器函数中可以调用GetAccount函数来获取登录的登录账号。
- BeforeExec函数是before_exec拦截器的一个实现。在BeforeExec函数中首先调用GetAccount函数来获取登录的登录账号,若不存在用户账号,则跳转到登录页面:login_get,否则执行处理去函数。
func HandlerIndex(c *wego.WebContext) {
c.WriteHTML(http.StatusOK, "./view/index.html", GetAccount(c))
}
在HandlerIndex中读取index.html模板,并使用调用 GetAccount(c)获取用户账号,然后及进行渲染。其中index.html模板的内容如下:
Title - 锐客网
hello : {{.}}
wego代码的下载 go get github.com/haming123/wego