Golang怎么做会话控制呢? | 青训营笔记

253 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记

😆在这里,我对今天所新学到的Golang的会话控制做了一次总结

😜Golang的其他知识在哪里找呢,那你就问对了

👨‍💻Golang基础复习 - 掘金 (juejin.cn) 在这里我总结了一些这篇文章没有提到的一些知识

😊如果有小伙伴能想到更多知识,欢迎大家在评论区留言,那么我们就开始吧

👩‍💻👨‍💻哟西,一个棕~

😎😎😎我是小小分割线

介绍

为什么要有会话控制呢?

我们大家都知道HTTP协议是无状态协议

服务器是不能记录浏览器的访问状态

也就是说服务器不能区分两次请求是否由一个客户端发出

我们有时是需要这样的需求

这样的设计严重阻碍了Web程序的设计

此时我们想到了一个方案:

Cookie

我们建一个Cookie发送给客户端,下次客户端拿着这个Cookie过来,那我就能知道他是谁了

Cookie保存在客户端中

每次发送请求都会带上cookie,这样我们就能知道客户端的身份了

我们来看看Cookie是什么样子的

type Cookie struct {

   // 键值对
   Name  string
   Value string

   // 携带Cookie访问的路径
   // 默认根目录所有路径
   Path       string    // optional
   
   // 设置域
   Domain     string    // optional
   
   // 过期时间
   // 默认是会话级别,也就是
   // 打开浏览器到关闭浏览器
   // 除了IE浏览器,一般不用这个,用MaxAge
   Expires    time.Time // optional
   RawExpires string    // for reading cookies only

   // MaxAge=0 means 表示没设置
   // MaxAge<0 means 表示立即删除Cookie
   // MaxAge>0 means 表示存在的时间,单位时秒
   MaxAge   int
   Secure   bool
   HttpOnly bool
   SameSite SameSite
   Raw      string
   Unparsed []string // 未解析的键值对的原始文本
}

cookie的运行原理

  1. 第一次向服务器发送请求时在服务器端创建Cookie

  2. 将Cookie以响应头的方式发送给浏览器

  3. 以后再发送请求时,浏览器就会带着这个Cookie

  4. 服务器得到Cookie后,根据Cookie的信息来区分不同的用户


创建Cookie并写入请求头发送到浏览器

// 建一个实现类
type myHandler struct {
}

// 实现Handler
func (m *myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {

 // 新建一个Cookie
 cookie := http.Cookie{
    Name:  "user01",
    Value: "cookie01",
 }

 // 放到请求头中发送
 writer.Header().Set("Set-Cookie", cookie.String())
}

func main() {

 // 实例化一个实现类
 myHandler := new(myHandler)

 http.Handle("/hello", myHandler)

 // 地址为8080端口
 // handler为nil,使用默认的handler
 http.ListenAndServe(":8080", nil)
}

运行结果

image.png

如果想要传送两个Cookie

我们可以对于头信息使用Add()

像这样

// 实现Handler
func (m *myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {

   // 新建一个Cookie
   cookie := http.Cookie{
      Name:  "user01",
      Value: "cookie01",
   }
   // 再建一个
   cookie02 := http.Cookie{
      Name:  "user02",
      Value: "cookie02",
   }

   // 放到请求头中发送
   writer.Header().Set("Set-Cookie", cookie.String())
   // 第二个用Add()
   writer.Header().Add("Set-Cookie", cookie02.String())
}

我们其实还有一种简单的方式

// 实现Handler
func (m *myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {

   // 新建一个Cookie
   cookie := http.Cookie{
      Name:  "user01",
      Value: "cookie01",
   }

   // 直接调用http包里的这个函数设置
   http.SetCookie(writer, &cookie)
}

获得请求中的Cookie

我们刚刚得知,Cooike是设置保存在头信息中的

那我们就可以从头信息中得到Cookie的信息

我们来试一试

// 建一个实现类
type myHandler struct {
}

// 实现Handler
func (m *myHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {

   // 获取请求头中所有的cookie
   cookies := request.Header["Cookie"]

   fmt.Println("所有的Cookies ==> ", cookies)
}

func main() {

   // 实例化一个实现类
   myHandler := new(myHandler)

   http.Handle("/hello", myHandler)

   // 地址为8080端口
   // handler为nil,使用默认的handler
   http.ListenAndServe(":8080", nil)
}

运行结果

image.png


Cookie的弊端:

如果Cookie很多,那么客户端和服务器的数据传输量就会很大

浏览器对Cookie是由限制的

那么我们该怎么办呢

此时Session就出现了

Session

Session是基础Cookie的一个会话技术

Cookie中只需要存放Session的ID

Session里的内容我们存放在服务器端就行

就相当于你拿着一张身份证,只需要证明你是本人,其他的信息我们放在官方的信息库中

那么此时,我们应该可以猜出我们的运行原理了

Session的运行原理

第一次向服务器发送请求时创建Session,给他设置一个ID

创建一个Cookie存放ID并返送回去浏览器

以后浏览器发送请求时会携带该Cookie

服务器拿到Cookie并拿出SessionID,也就能对于到某个Session


Golang中使用Cookie和Session做的会话控制也就分享完了

😎😎😎又是我,我还是小小分割线

都用心看到这里了,那就求个赞吧😘

🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好