开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
Cookie简介
在web开发中,由于http是无状态协议,所以在碰到需要登录或者需要校验的场景时http无法保存浏览器的访问记录,例如用户在第一次请求时登录了系统,那么在第二次请求时要怎么样才能去判断当前用户是否登录,这时候就需要使用到cookie,cookie是解决这个问题的方案之一。
cookie中文是曲奇的意思,在web开发中表示存储在用户浏览器中的一个文本文件,当用户通过浏览器登录之后,后端可以返回一个cookie保存到浏览器中,然后后续的请求都带上这个cookie,这样后端就能通过cookie来判断用户是否登录。
cookie是由服务器创建发送到浏览器,然后浏览器又携带回给服务器。
Cookie使用
在Gin框架中设计到cookie的有两个核心方法:
func (c *Context) Cookie(name string) (string, error):获取前端传递的cookie
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool):通过Gin框架设置cookie并保存到请求的浏览器里面。
Cookie方法传入一个cookie的名称即可获取到对应的cookie。
SetCookie方法参数列表如下:
- name:cookie名
- value:cookie值
- maxAge:cookie存活时间,单位秒
- path:cookie保存路径
- domain:域名
- secure:是否只能通过https访问
- httpOnly:是否允许别人通过js获取自己的cookie
代码示例:
代码中定义了两个路由规则,一个是login登录,当用户请求这个地址之后会通过Gin框架设置一个cookie到浏览器中,然后浏览器在后续访问index时则可携带当前cookie,在index路由中通过Cookie获取前端携带的cookie值,对获取到的cookie值进行校验,判断请求是否合法(案例演示,实际开发不会这么简单)。
func main() {
g := gin.Default()
g.GET("/login", func(c *gin.Context) {
c.SetCookie("cookieName", "cookie1001", 60*60, "/gin-study", "localhost", false, true)
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
g.GET("/index", func(c *gin.Context) {
cookie, _ := c.Cookie("cookieName")
if cookie != "cookie1001" {
c.JSON(http.StatusUnauthorized, gin.H{
"message": "请先登录",
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "ok",
})
})
err := g.Run(":8888")
if err != nil {
return
}
}
运行结果:
通过浏览器访问login页面,可以看到在浏览器的Cookie里面已经保存了我们之前设置的Cookie。
然后在postman中不携带cookie访问index,会返回请先登录的提示。
在postman中携带cookie访问index:
在postman中添加cookie可以点击上图中右上角Cookies蓝色文字进行添加。
Cookie缺点:
- cookie是以明文方式传输,安全性不高
- cookie存储在浏览器中,可能会被其他人获取,非法请求
- 浏览器限制了Cookie的数量和大小(一般最多存储50 个,每个不超过4KB)