基本介绍

接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp#Cookie

常用方法:

type Cookie
    func GetCookie(r *Request) *Cookie
    func (c *Cookie) Contains(key string) bool
    func (c *Cookie) Flush()
    func (c *Cookie) Get(key string, def ...string) string
    func (c *Cookie) GetSessionId() string
    func (c *Cookie) Map() map[string]string
    func (c *Cookie) Remove(key string)
    func (c *Cookie) RemoveCookie(key, domain, path string)
    func (c *Cookie) Set(key, value string)
    func (c *Cookie) SetCookie(key, value, domain, path string, maxAge time.Duration, httpOnly ...bool)
    func (c *Cookie) SetHttpCookie(httpCookie *http.Cookie)
    func (c *Cookie) SetSessionId(id string)

任何时候都可以通过*ghttp.Request对象获取到当前请求对应的Cookie对象,因为CookieSession都是和请求会话相关,因此都属于ghttp.Request的成员对象,并对外公开。Cookie对象不需要手动Close,请求流程结束后,HTTP Server会自动关闭掉。

此外,Cookie中封装了两个SessionId相关的方法:

  1. Cookie.GetSessionId()用于获取当前请求提交的SessionId,每个请求的SessionId都是唯一的,并且伴随整个请求流程,该值可能为空。
  2. Cookie.SetSessionId(id string)用于自定义设置SessionIdCookie中,返回给客户端(往往是浏览器)存储,随后客户端每一次请求在Cookie中可带上该SessionId

在设置Cookie变量的时候可以给定过期时间,该时间为可选参数,默认的Cookie过期时间为一年。

默认的SessionIdCookie中的存储名称为gfsession

使用示例

package main

import (
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/os/gtime"
    "github.com/gogf/gf/v2/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/cookie", func(r *ghttp.Request) {
        datetime := r.Cookie.Get("datetime")
        r.Cookie.Set("datetime", gtime.Datetime())
        r.Response.Write("datetime:", datetime)
    })
    s.SetPort(8199)
    s.Run()
}

执行外层的main.go,可以尝试刷新页面 http://127.0.0.1:8199/cookie ,显示的时间在一直变化。

对于控制器对象而言,从基类控制器中继承了很多会话相关的对象指针,可以看做alias,可以直接使用,他们都是指向的同一个对象:

type Controller struct {
	Request  *ghttp.Request  // 请求数据对象
	Response *ghttp.Response // 返回数据对象(r.Response)
	Server   *ghttp.Server   // WebServer对象(r.Server)
	Cookie   *ghttp.Cookie   // COOKIE操作对象(r.Cookie)
	Session  *ghttp.Session  // SESSION操作对象
	View     *View           // 视图对象
}

由于对于Web开发者来讲,Cookie都已经是非常熟悉的组件了,相关API也非常简单,这里便不再赘述。

Cookie会话过期

Cookie的有效期默认是1年,如果我们期望Cookie随着用户的浏览会话过期,像这样:

那么我们仅需要通过SetCookie来设置Cookie键值对并将maxAge参数设置为0即可。像这样:

r.Cookie.SetCookie("MyCookieKey", "MyCookieValue", "", "/", 0)
Content Menu

  • No labels

3 Comments

  1. cookie 的使用示例写反了?

    package main
    
    import (
        "github.com/gogf/gf/v2/frame/g"
        "github.com/gogf/gf/v2/os/gtime"
        "github.com/gogf/gf/v2/net/ghttp"
    )
    
    func main() {
        s := g.Server()
        s.BindHandler("/cookie", func(r *ghttp.Request) {
    		//先设置`datetime`变量值
            r.Cookie.Set("datetime", gtime.Datetime())
    		//再获取变量值
    	 	datetime := r.Cookie.Get("datetime")
            r.Response.Write("datetime:", datetime)
        })
        s.SetPort(8199)
        s.Run()
    }
  2. httponly只读设置

    s.BindHandler("/cookie",func(r *ghttp.Request) {
     r.Cookie.SetCookie("tesst", "", r.Request.Host, "/", 0, ghttp.CookieOptions{
    				Secure:   false, // 安全关闭
    				HttpOnly: false, // 只读关闭
    			})
    })
  3. 对于控制器对象而言,从基类控制器中继承了很多会话相关的对象指针,可以看做alias,可以直接使用,他们都是指向的同一个对象:

    中的“他们都是指向的同一个对象

    应该去掉“的”,修改后为:

    对于控制器对象而言,从基类控制器中继承了很多会话相关的对象指针,可以看做alias,可以直接使用,他们都是指向同一个对象: