设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间18 现在时间18 缓存数据 凭什么要把我教给你的东西,都给下一个女孩子。

凭什么要把我教给你的东西,都给下一个女孩子。 -- 还是分开

查看: 1113|回复: 3

Go WEB框架使用拦截器验证用户登录状态实现

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:203
  • 打卡月天数:0
  • 打卡总奖励:2945
  • 最近打卡:2023-08-27 06:24:06
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
376
主题
348
精华
0
金钱
4036
积分
738
注册时间
2022-12-21
最后登录
2025-3-15

发表于 2023-5-7 17:22:15 | 显示全部楼层 |阅读模式
wego拦截器

wego拦截器是一个action(处理器函数)之前或之后被调用的函数,通常用于处理一些公共逻辑。拦截器能够用于以下常见问题:

  • 请求日志记录
  • 错误处理
  • 身份验证处理
wego中有以下拦截器:

  • before_exec :执行action之前拦截器
  • after_exec :执行action之后拦截器
本文用一个例子来说明如何使用拦截器来实现用户登录状态的判定。在这个例子中,用户访问login_get来显示登录页面,并调用login_post页面来提交登录信息。
在login_post页面中判定用户登录信息是否合法,并将登录账号保存在session中。用户访问其他需要登录验证的页面(例如:index页面)前首先执行拦截器:handler.BeforeExec。
在拦截器中获取用户账号,若没有获取到用户账号,则跳转到登录页面:login_get。使用拦截器来进行用户登录状态的检查的有点是,不用在每个处理器函数中都包含用户登录状态的检查逻辑。只要将登录逻辑独立出来,并实现为before_exec拦截器即可。
以下时main函数的主要内容:

main函数
  1. package main
  2. import (
  3.     "demo/handler"
  4.     "github.com/haming123/wego"
  5.     log "github.com/haming123/wego/dlog"
  6. )
  7. func main() {
  8.     web, err := wego.InitWeb()
  9.     if err != nil {
  10.         log.Error(err)
  11.         return
  12.     }
  13.     wego.SetDebugLogLevel(wego.LOG_DEBUG)
  14.     web.Config.SessionParam.SessionOn = true
  15.     web.Config.SessionParam.HashKey = "demohash"
  16.     web.BeforExec(handler.BeforeExec)
  17.     web.GET("/login_get", handler.HandlerLoginGet).SkipHook()
  18.     web.POST("/login_post", handler.HandlerLoginPost).SkipHook()
  19.     web.GET("/index", handler.HandlerIndex)
  20.     err = web.Run("0.0.0.0:8080")
  21.     if err != nil {
  22.         log.Error(err)
  23.     }
  24. }
复制代码
说明:

  • 本例子中使用基于cookie的session数据存储引擎,用于存储用户登录账号。
  • 调用
    1. web.BeforExec(handler.BeforeExec)
    复制代码
    来设置拦截器,在
    1. handler.BeforeExec
    复制代码
    拦截器中实现了登录状态的检查逻辑。
  • 由于login_get页面、login_post页面不需要进行登录检验,使用
    1. SkipHook()
    复制代码
    来忽略拦截器。

登录逻辑

用户访问需要进行登录验证的页面时,首先会检查session的登录账号,若没有登录账号,则跳转到登录页面:login_get, 登录页面的处理器实现如下:
  1. func HandlerLoginGet(c *wego.WebContext) {
  2.     c.WriteHTML(http.StatusOK, "./view/login.html", nil)
  3. }
复制代码
login.html的内容如下:
  1. <!doctype html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>登录页面</title>
  6. </head>
  7. <body>
  8. <h2>用户登陆</h2>
  9. <form action="/login_post" method="post">
  10.     <div>用户账号:</div>
  11.     <div>
  12.         <input type="text" name="account" placeholder="请输入用户账号" />
  13.     </div>
  14.     <br />
  15.     <div>登录密码:</div>
  16.     <div>
  17.         <input type="password" name="password" placeholder="请输入登录密码"/>
  18.     </div>
  19.     <br />
  20.     <div>
  21.         <input type="submit" value="立即登录" />
  22.     </div>
  23. </form>
  24. </body>
  25. </html>
复制代码
用户点击"立即登录"后项服务器发送post请求到login_post, login_post处理器的实现如下:
  1. func HandlerLoginPost(c *wego.WebContext) {
  2.     account := c.Param.MustString("account")
  3.     password := c.Param.MustString("password")
  4.     if account == "admin" && password == "demo" {
  5.         c.Session.Set("account", account)
  6.         c.Session.Save()
  7.         c.Redirect(302, "/index")
  8.     } else {
  9.         c.Session.Set("account", "")
  10.         c.Session.Save()
  11.         c.Redirect(302, "/login_get")
  12.     }
  13. }
复制代码
说明:

  • 在HandlerLoginPost调用c.Session.Set将账号写入session。

登录拦截器的实现

登录检查的逻辑采用before_exec拦截器来实现,以下是before_exec拦截器的代码:
  1. func GetAccount(c *wego.WebContext) string {
  2.     account, _ := c.Session.GetString("account")
  3.     return account
  4. }
  5. func BeforeExec(c *wego.WebContext) {
  6.     login_path := "/login_get"
  7.     if GetAccount(c) == "" && c.Path != login_path {
  8.         c.Redirect(302, login_path)
  9.         return
  10.     }
  11. }
复制代码
说明:

  • 实现GetAccount函数来获取session数据,若用户成功登录了系统,则session中保存有用户的登录账号。在处理器函数中可以调用GetAccount函数来获取登录的登录账号。
  • BeforeExec函数是before_exec拦截器的一个实现。在BeforeExec函数中首先调用GetAccount函数来获取登录的登录账号,若不存在用户账号,则跳转到登录页面:login_get,否则执行处理去函数。

index页面的实现

index页面需要验证用户是否登录,由于执行index页面的处理器前会执行before_exec拦截器, 因此在index页面的处理器函数中不需要再进行登录检查了,程序员只需要实现业务逻辑即可。index页面的处理器函数的实现代码如下:
  1. func HandlerIndex(c *wego.WebContext) {
  2.     c.WriteHTML(http.StatusOK, "./view/index.html", GetAccount(c))
  3. }
复制代码
在HandlerIndex中读取index.html模板,并使用调用 GetAccount(c)获取用户账号,然后及进行渲染。其中index.html模板的内容如下:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6. </head>
  7. <body>
  8. hello : {{.}}
  9. </body>
  10. </html>
复制代码
wego代码的下载
go get https://github.com/haming123/wego
以上就是Go WEB框架使用拦截器验证用户登录状态实现的详细内容,更多关于Go WEB验证用户登录状态的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-5-18 03:56:03 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:28
  • 打卡月天数:0
  • 打卡总奖励:339
  • 最近打卡:2025-03-16 16:18:29
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
384
积分
58
注册时间
2023-3-22
最后登录
2025-3-16

发表于 2024-12-1 17:09:45 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
15
积分
10
注册时间
2022-12-24
最后登录
2022-12-24

发表于 6 天前 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表