Go Web 学习笔记(七)会话控制
Go Web 会话控制
由于 http 协议是无状态的,导致服务器并不能够了解到当前用户的信息。
因此便有了一些用户进行用户会话控制的方法:cookie&session
Cookie
Cookie 实际上是服务器保存在浏览器上的一段信息。
浏览器有了 Cookie 之后,每次向服务器发送请求的时候就会将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
Go Web net/http
中 Cookie 结构体的内容:
type Cookie struct {
Name string
Value string
Path string
Domain string
Expires time.Time
RawExpires string
// MaxAge=0表示未设置Max-Age属性
// MaxAge<0表示立刻删除该cookie,等价于"Max-Age: 0"
// MaxAge>0表示存在Max-Age属性,单位是秒
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []string // 未解析的“属性-值”对的原始文本
}
Cookie的运行原理
1、第一次向服务器发送请求时在服务器端创建cookie;
2、将在服务器端创建的cookie以响应头的方式发送给浏览器;
3、之后浏览器向服务器发送请求时会将该cookie以请求头的方式发送给服务器;
4、服务器得到cookie之后根据cookie的信息来区分不同的用户。
Go响应中设置Cookie
方法一:
在请求处理器 Handler 中,使用 http.ResponseWriter
对应的 Header().Set
方法进行设置(首次需要设置,之后可以使用 add 进行添加)
w.Header().Set("Set-Cookie",cookie1)
w.Header().Add("Set-Cookie",cookie2)
方法二:
直接使用 http
的 SetCookie
方法(推荐):
http.SetCookie(w,&cookie)
Go请求中获取Cookie
方法一:获取所有cookie
使用 http.Request
中的 Header
(map类型)就可以直接获取所有的 Cookie 信息:
r.Header["Cookie"]
方法二:根据 cookie 的name获取指定的cookie
使用 http.Request
中的 Cookie 方法传入的 name
直接获取
r.Cookie("name")
Cookie 的用途
- 广告推荐
- 免登陆
Session
Cookie 保存在浏览器中的文件,会受磁盘空间的大小受限,同时也会增加网络传输的数据量。并且浏览器页可以对 Cookie 进行限制,因此就有了 Session。
Session 时保存在服务器的文件,可以理解为一个状态列表,拥有一个唯一识别符号 sessionId
(通常存放于cookie中),服务器收到 cookie 后解析出 sessionId,再去 session 列表中查找,就能找到相应 session。
Session的运行原理
1、浏览器第一次向服务器发送请求的时候创建 Session,并设置一个全球唯一的Id(UUID);
2、创建一个Cookie,将 Cookie 的 Value 设置为 Session 的 id 值,并将 Cookie 发送给浏览器;
3、之后浏览器向服务器发送请求的时候都会携带对应的 Cookie;
4、根据浏览器发送的 Cookie 中获取响应的 sessionid,然后服务器根据对应的 Sessionid 找到对应的 session。
在实际项目开发当中需要自己实现一套相应的 Session 存储机制。需要自定义 Session 的格式并将其保存在文件、数据库、缓存中等位置。也可以使用一些成熟的 Session 框架来实现相应的功能。