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

目录
  • wego拦截器
  • main函数
  • 登录逻辑
  • 登录拦截器的实现
  • index页面的实现

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函数

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()来忽略拦截器。

登录逻辑

用户访问需要进行登录验证的页面时,首先会检查session的登录账号,若没有登录账号,则跳转到登录页面:login_get, 登录页面的处理器实现如下:

func HandlerLoginGet(c *wego.WebContext) {
    c.WriteHTML(http.StatusOK, "./view/login.html", nil)
}

login.html的内容如下:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h2>用户登陆</h2>
<form action="/login_post" method="post">
    <div>用户账号:</div>
    <div>
        <input type="text" name="account" placeholder="请输入用户账号" />
    </div>
    <br />
    <div>登录密码:</div>
    <div>
        <input type="password" name="password" placeholder="请输入登录密码"/>
    </div>
    <br />
    <div>
        <input type="submit" value="立即登录" />
    </div>
</form>
</body>
</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。

登录拦截器的实现

登录检查的逻辑采用before_exec拦截器来实现,以下是before_exec拦截器的代码:

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,否则执行处理去函数。

index页面的实现

index页面需要验证用户是否登录,由于执行index页面的处理器前会执行before_exec拦截器, 因此在index页面的处理器函数中不需要再进行登录检查了,程序员只需要实现业务逻辑即可。index页面的处理器函数的实现代码如下:

func HandlerIndex(c *wego.WebContext) {
    c.WriteHTML(http.StatusOK, "./view/index.html", GetAccount(c))
}

在HandlerIndex中读取index.html模板,并使用调用 GetAccount(c)获取用户账号,然后及进行渲染。其中index.html模板的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello : {{.}}
</body>
</html>

wego代码的下载

go get https://github.com/haming123/wego

以上就是Go WEB框架使用拦截器验证用户登录状态实现的详细内容,更多关于Go WEB验证用户登录状态的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言对前端领域的入侵WebAssembly运行原理

    目录 引言 WebAssembly 运行原理 Go WebAssembly 运行原理 Go WebAssembly 初体验 第一步 第二步 第三步 第四步 第五步 Javascript 真的需要担心 Go WebAssembly 的威胁么? 引言 从 Go 语言诞生以来,它就开始不断侵蚀 Java .C.C++ 语言的领地.今年下半年 Go 语言发布了 1.11 版本,引入了 WebAssembly 技术,浏览器端 Javascript 的垄断地位也开始遭遇 Go 语言的攻击.这次不同以往,它意

  • 使用Golang搭建web服务的实现步骤

    如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了. 我们先看个例子:http.go package main import ( "fmt" "io" "log" "net/http" ) func main() { http.HandleFunc("/test", doRequest) // 设置访问路由 err := http.List

  • Go web入门Go pongo2模板引擎

    目录 下载 pongo2 函数库 从字符串中读取模板 从文件中读取文本 Go pongo2 迭代 Go pongo2 过滤 Go pongo2 条件 总结 Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板. 模板引擎是一个库,旨在将模板与数据结合起来以生成文档.模板引擎用于生成大量电子邮件.源代码预处理或生成动态 HTML 页面. 模板由静态数据和动态区域组成.动态区域稍后被数据替换.渲染函数稍后将模板与数据结合起来.模板引擎用于将模板与数据模型相结合以

  • Go Web编程添加服务器错误和访问日志

    目录 前言 初始化日志记录器 添加错误日志 添加访问日志 前言 错误日志和访问日志是一个服务器必须支持的功能,我们教程里使用的服务器到目前为止还没有这两个功能.正好前两天也写了篇介绍logrus日志库的文章,那么今天的文章里就给我们自己写的服务器加上错误日志和访问日志的功能.在介绍添加访问日志的时候会介绍一种通过编写中间件获取HTTP响应的StausCode和Body的方法. Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考.公众号中回复gohttp11获取本文源代码

  • Go语言使用Request,Response处理web页面请求

    Go语言处理web页面请求 Request和Response http Requset和Response的内容包括以下几项: Request or response line Zero or more headers An empty line, followed by … … an optional message body 例如一个http Request: GET /Protocols/rfc2616/rfc2616.html HTTP/1.1 Host: www.w3.org User-

  • Go语言入门Go Web Fiber框架快速了解

    目录 Fiber 创建一个 HelloWorld Fiber 路由 Go Fiber 状态码 Go Fiber 发送短信 Go Fiber headers Go Fiber 发送文件 Go Fiber 教程展示了如何使用 Fiber 框架在 Golang 中创建简单的 Web 应用程序. Fiber是一个简单快速的 Go Web 框架. Fiber 专注于极致性能和低内存占用.它的灵感来自流行的 Express JS 框架. Fiber 创建一个 HelloWorld package main

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

    目录 wego拦截器 main函数 登录逻辑 登录拦截器的实现 index页面的实现 wego拦截器 wego拦截器是一个action(处理器函数)之前或之后被调用的函数,通常用于处理一些公共逻辑.拦截器能够用于以下常见问题: 请求日志记录 错误处理 身份验证处理 wego中有以下拦截器: before_exec :执行action之前拦截器 after_exec :执行action之后拦截器 本文用一个例子来说明如何使用拦截器来实现用户登录状态的判定.在这个例子中,用户访问login_get来

  • spring aop action中验证用户登录状态的实例代码

    最近在学习ssh框架时,照着网上做了一个商城系统,之前在一些需要用户存在的操作中,都是在每一个action中写重复的代码,这样做现在想起来并不好,想起了spring的aop,于是想通过aop来给每个需要用户操作的Action验证用户登录状态. 想法是这样的: 1. 用户登录时把userId放入session中 2. 通过spring 写一个advice来获取session中的userId,判断用户登录状态,如果userId不符合,则抛出自定义异常 3. 通过struts中配置来捕获异常,跳转界面

  • vue-router beforeEach跳转路由验证用户登录状态

    使用vue判断验证用户登录状态 导航钩子类似于生命周期钩子,包含路由进入前,进入后,更新时,退出前等几个周期,主要用于控制导航的前进后退或跳转等. 其中router.beforeEach就是路由进入前的周期,同时有路由的来源和去向两个参数,可以判断和控制当前路由的走向和重定向. 一般router.beforeEach配合vuex全局状态储存使用,验证用户登录状态.也可以结合sessionStorage 和localStorage使用,原理相同. 用户登录状态验证 路由配置 定义需要判断登录状态的

  • Redis + Java拦截器实现用户匿名和非匿名访问

    目录 需求 实现截图 核心代码 WebMvcConfigurer HandlerInterceptor 判断用户是否有权限 ThreadLocal 该篇文章以<Redis实现短信验证码登录>这篇文章为基础,以Redis和Java拦截器为核心,对登录功能展开研究和应用. 需求 对所有的接口按需分类 一些接口可以匿名访问 一些接口必须登录才可以访问 刷新token 实现截图 获取验证码 用验证码完成登录,并获取token 用token实现访问非匿名访问接口 核心代码 WebMvcConfigure

  • SpringMVC拦截器实现单点登录

    单点登录的功能在实际的应用场景中还是很重要的,逻辑上我们也不允许一个用户同时在进行着两个操作,下面就来了解一下SpringMVC的单点登录实现 SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理. 1,先探究一个

  • springboot使用拦截器判断是否登录

    目录 springboot拦截器判断是否登录 实现拦截器的两个步骤 1.自定义拦截器 2.自定义配置类继承WebMvcConfigurerAdapter springboot 增加拦截器判断是否登录 1.创建拦截器 2.继承WebMvcConfigureAdapter类 3.LoginController 4.未登录会自动跳转到登录页面 springboot拦截器判断是否登录 实现拦截器的两个步骤 自定义拦截器实现HandlerInterceptor接口 创建一个配置类继承WebMvcConfi

  • AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)

    本文实例讲述了AngularJS实现用户登录状态判断的方法.分享给大家供大家参考,具体如下: 使用AngularJS的单页面应用时,由于是本地路由在控制页面跳转,但是有的时候我们需要判断用户是否登录来判断用户是否能进入界面. angularjs是mvc架构所以实现起来很容易也很灵活,我们只MainController里增加一个路由事件侦听并判断,这样就可以避免未登录用户直接输入路由地址来跳转到登录界面地址了 代码中的 $rootScope.user是登录后把用户信息放到了全局rootScope上

  • Struts2拦截器 关于解决登录的问题

    拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次发送请求. 拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 我们可以让每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 接下来我们该如何定义一个拦截器: 自定义一个拦截器如下: 1.实现Interceptor接口或者继承AbstractInterceptor抽象类. 2

  • .net MVC使用Session验证用户登录(4)

    用最简单的Session方式记录用户登录状态 1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问控制器前触发 public class DefaultController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); va

  • 使用AJAX(包含正则表达式)验证用户登录的步骤

    我们来分一下步骤吧: 1.HTML代码,页面先写出来: 2.正则表达式验证输入的用户名密码是否正确,失去焦点验证 3.Ajax异步提交 4.servlet这是后台处理代码获取数据并对比响应,然后跳转成功页面 效果图: 结构: 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "

随机推荐