暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Golang Web开发之Gin会话控制

一起Go技术 2021-11-14
400

声明:这是一个系列,系列中,我将为您介绍Gin框架



在本文中,我将为您介绍,Gin框架关于会话控制——cookie相关的内容


Gin Cookie


Gin中提供了cookie 的功能,下面为您阐述它。


1. Cookie简介

我们知道,HTTP协议是一种无状态的协议,这也就是说,服务端是不能够记录客户端的访问状态,换句话说,也就是服务端不能区分两次请求是否由同一个客户端发出的。而Cookie就是解决HTTP协议无状态的方案之一。

Cookie实际上就是服务器保存在浏览器上的一段信息(用于在浏览器中保存一些小数据,例如客户标识、用户非敏感数据)。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。Cookie由服务器创建,并发送给浏览器,最终由浏览器保存。

■ ■■■

2. 如何设置Cookie

在Gin中,您可以使用上下文的SetCookie方法设置cookie。其源码如下:
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) {
if path == "" {
path = "/"
}
http.SetCookie(c.Writer, &http.Cookie{
Name: name,
Value: url.QueryEscape(value),
MaxAge: maxAge,
Path: path,
Domain: domain,
SameSite: c.sameSite,
Secure: secure,
HttpOnly: httpOnly,
})
}
其中,name是cookie名字;Value是cookie的值;MaxAge表示有效时间,单位是秒;Path是cookie路径;Domain是cookie的作用域。

如下示例代码:
package main


import (
  "github.com/gin-gonic/gin"
)


func main() {
  router := gin.Default()
router.GET("/set_cookie", func(c *gin.Context) {
// 设置cookie
     c.SetCookie("test_cookie""cookie_value"3600"/""localhost"falsetrue)
})


router.Run()
}
■ ■■■

3. 如何获取cookie

在Gin中,可用上下文的Cookie方法获取设置的cookie。其源码如下:
func (c *Context) Cookie(name string) (string, error) {
cookie, err := c.Request.Cookie(name)
if err != nil {
return "", err
}
val, _ := url.QueryUnescape(cookie.Value)
return val, nil
}

例子:
package main


import (
"github.com/gin-gonic/gin"
)


func main() {
  router := gin.Default()


router.GET("/get_cookie", func(c *gin.Context) {
    data, _ := c.Cookie("test_cookie")
c.String(200, data)
})


router.Run()
}

■ ■■■


4. 删除cookie

您可以通过将Cookie的MaxAge设置为-1, 达到删除cookie的目的。如下示例:
package main


import (
"github.com/gin-gonic/gin"
)


func main() {
  router := gin.Default()


router.GET("/del_cookie", func(c *gin.Context) {
// 设置cookie MaxAge设置为-1,表示删除cookie
c.SetCookie("test_cookie", "cookie_value", -1, "/", "localhost", false, true)
c.String(200,"删除cookie")
})


router.Run()
}

■ ■■■


5. 一个例子

模拟一个场景:您的API资源,只有在用户登录的时候才可以访问到。
package main


import (
"net/http"


"github.com/gin-gonic/gin"
)


func LoginAuthMiddlewareware() gin.HandlerFunc {
return func(c *gin.Context) {
//
cookie, err := c.Cookie("username")

if err == nil {
if cookie == "zhangsan" {
c.Next()
return
}
}


c.JSON(http.StatusUnauthorized, gin.H{"error": "err"})
// 验证不通过,不再调用后续的函数处理
c.Abort()
return
}
}


func main() {
router := gin.Default()

// 需要携带cookie可访问
router.GET("/users", LoginAuthMiddlewareware(), func(c *gin.Context) {
c.String(http.StatusOK, "users")
})


// 登录,设置cookie
router.POST("/login", func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")


if username == "zhangsan" && password == "admin666" {
c.SetCookie("username", "zhangsan", 60, "/", "localhost", false, false)
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"msg": "登录成功",
})
    } else {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusUnauthorized,
"msg": "登录失败",
      })
}
})

router.Run()
}


现在,将上面的代码运行起来,可以分别测试这两个API了观察现象了。按照流程,应该先登录:




可以看到,zhangsan 成功登录了。接着在在/users接口的headers中带上刚才的cookie的值,访问成功:


■ ■■■



总结


本文主要介绍了,在Gin中cookie的相关知识,并介绍了如何在Gin中该如何操作cookie,另外介绍了一个cookie的demo案例。


后续,我将继续为您介绍Gin的一些其他教程,敬请期待~~。




  end 
👇👇👇👇👇👇

长按二维码关注我们吧


不要错过



因为你的分享、点赞、在看
我足足的精气神儿!




文章转载自一起Go技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论