这是我参与「第三届青训营 -后端场」笔记创作活动的的第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的运行原理
-
第一次向服务器发送请求时在服务器端创建Cookie
-
将Cookie以响应头的方式发送给浏览器
-
以后再发送请求时,浏览器就会带着这个Cookie
-
服务器得到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)
}
运行结果
如果想要传送两个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)
}
运行结果
Cookie的弊端:
如果Cookie很多,那么客户端和服务器的数据传输量就会很大
浏览器对Cookie是由限制的
那么我们该怎么办呢
此时Session就出现了
Session
Session是基础Cookie的一个会话技术
Cookie中只需要存放Session的ID
Session里的内容我们存放在服务器端就行
就相当于你拿着一张身份证,只需要证明你是本人,其他的信息我们放在官方的信息库中
那么此时,我们应该可以猜出我们的运行原理了
Session的运行原理
第一次向服务器发送请求时创建Session,给他设置一个ID
创建一个Cookie存放ID并返送回去浏览器
以后浏览器发送请求时会携带该Cookie
服务器拿到Cookie并拿出SessionID,也就能对于到某个Session
Golang中使用Cookie和Session做的会话控制也就分享完了
😎😎😎又是我,我还是小小分割线
都用心看到这里了,那就求个赞吧😘
🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好