zoukankan      html  css  js  c++  java
  • [Go] Cookie 使用简介

    Golang 的 Cookie

    web 开发免不了要和 cookie 打交道。Go 的 http 库也提供了 cookie 的相关操作。

    type Cookie struct {
      Name       string
      Value      string
      Path       string
      Domain     string
      Expires    time.Time
      RawExpires string
      MaxAge     int
      Secure     bool
      HttpOnly   bool
      Raw        string
      Unparsed   []string
    }

    Name 字段为 cookie 的名字,Value 是其值,剩下的 Path 和 Domain 则是 cookie 的存储的范围。Expires 是 cookie 的过期时间,如果不设置,那么这是一个 session 型的 cookie,即浏览器会话有用,一旦关闭浏览器,cookie 随即会被删除。

    设置 Cookie

    cookie 是 header 一项内容,因此可以使用 reponse 的 Header 方法设置 cookie。

    func setCookieHandler(w http.ResponseWriter, r *http.Request) {
        c1 := http.Cookie{
            Name: "first_cookie",
            Value: "vanyar",
            HttpOnly: true,
        }
    
        c2 := http.Cookie{
            Name: "second_cookie",
            Value: "noldor",
            HttpOnly:true,
        }
        w.Header().Set("Set-Cookie", c1.String())
        w.Header().Add("Set-Cookie", c2.String())
    }

    cookie.png

    这里也可以测试验证 Set 和 Add 两个方法的差别。当然,和文件上传类似,Go 也提供了常用的工具函数。

    http.SetCookie(w, &c1)
    http.SetCookie(w, &c2)

    http 的 SetCookie 方法也可以设置 cookie,就不需要关系 Set 和 Add 的先后顺序了,当然第二个参数是一个 Cookie 的指针对象。设置了 cookie,接下来就是需要读 cookie。

    读取 Cookie

    读取 cookie 的方式也有很多,cookie 封装在header中,当然可以通过 header 方法处理。

    func getCookieHandler(w http.ResponseWriter, r *http.Request) {
        h := r.Header["Cookie"]
        fmt.Fprintln(w, h)
    }

    不使用 Header 方法,也可以使用 Request 的方法:

    func getCookieHandler(w http.ResponseWriter, r *http.Request) {
        c1, err := r.Cookie("first_cookie")
        if err != nil{
            fmt.Fprintln(w, "Cannot get cookie")
        }
        cs := r.Cookies()
        fmt.Fprintln(w, c1)
        fmt.Fprintln(w, cs)
    }

    访问的时候可以发现,r.Cookie 返回了对于 key 的键值对,而 r.Cookies 则返回了所有 cookie 的 key 的键值对值。

    Cookie 与 消息

    cookie 的作用很多,通常记录客户端的一些信息,用来做用户的登录验证。现在我们需要使用 cookie 来做一个小特性---消息。通常 web 请求发出后,response 返回数据,也可以设置一些消息用来指引用户。

    func setMessageHandler(w http.ResponseWriter, r *http.Request) {
        msg := []byte("Hello World")
        c := http.Cookie{
            Name: "flash",
            Value:base64.URLEncoding.EncodeToString(msg),
        }
        http.SetCookie(w, &c)
    }
    
    func getMessageHandler(w http.ResponseWriter, r *http.Request) {
        c, err := r.Cookie("flash")
        if err != nil {
            if err == http.ErrNoCookie {
                fmt.Fprintln(w, "No message found")
            }
        } else {
            rc := http.Cookie{
                Name: "flash",
                MaxAge: -1,
                Expires:time.Unix(1, 0),
            }
            http.SetCookie(w, &rc)
            val, _ := base64.URLEncoding.DecodeString(c.Value)
            fmt.Fprintln(w, string(val))
        }
    }

    setMessageHandler 函数很简单,就是创建一个 cookie 实例,然后把消息写入到 cookie,然后再返回给客户端。

    getMessageHandler 首先会读取 key 为 flash 的 cookie,如果没读到内容,则表示消息不存在,否则就创建另外一个 cookie,设置其过期时间这里等于清除 cookie。然后把读取出来的 message 返回给客户端。完成消息通信。

    总结

    我们讨论了 Go 中 cookie 的基本应用。现在的 web 开发中,人们越来越重视网络安全,因此 cookie 的安全也成为用户关心的内容。Go 原生的 cookie 封装比较简单。Go 的社区却开发了很多轮子,实现了secure cookie,例如 gorilla/securecookie 库。实际开发中,可能会借助一些三方的库或包来完成功能。

  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/52php/p/6407947.html
Copyright © 2011-2022 走看看