Cookie 与 Session
Go Web 编程
- HTTP 协议是无状态的,对于一个浏览器发出的多次请求,WEB 服务器无法区分, 是不是来源于同一个浏览器, 所以诞生了Cookie 与 Session 使某个域名下的所有网页能够共享某些数据.
Cookie
Cookie实际上是一小段的文本信息(key-value)形式,Cookie是纯文本格式,不包含任何可执行的代码.客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用
Response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Cookie 机制
客户端
User-Agent发送一个请求到服务器。服务器发送一个
HttpResponse响应到客户端,其中包含Set-Cookie的头部。客户端保存
Cookie, 之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部。服务器返回响应数据。
Cookie 特点
客户端发送请求的时候, 会携带服务端
HttpResponse之前Set-Cookie的Cookie信息。服务端可以设置
Cookie数据key/value信息。Cookie是针对单个域名的,不同域名之间的Cookie是独立的。Cookie数据可以配置过期时间,过期的Cookie数据会被系统清除。
Golang 使用 Cookie
- Go语言中
net/http标准库定义了Cookie。
| |
- 使用
net/http标准库中的SetCookie函数, 设置Cookie.
| |
获取
Cookie,Request对象拥有两个获取Cookie的方法和一个添加Cookie的方法- 获取
Cookie方法
- 获取
| |
- 添加Cookie的方法
| |
Gin 框架 Cookie
利用
c *gin.Contextc.SetCookie设置Cookiec.Cookie获取Cookie例子:
| |
- Html 文件
| |
| |
| |
Session
Session与Cookie都是会话保持的机制,Session是记录客户状态的机制, 不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
Session 原理
浏览器向服务器发送登录请求(post), 携带账号和密码。
登录成功, 服务器记录登录的状态,
req.session.user = user; 服务器记录这些信息。服务器返回的响应头中携带服务器生成的
Session ID并将Session ID记录到Cookie中,作为身份标识。浏览器再次访问服务器的时候会通过
Cookie携带Session ID。服务器获取浏览器发送的
Session ID后, 在服务器查找Session ID, 如果找不到, 返回未登录状态。如果找到
Session ID, 根据Session ID查找对应的对象, 返回登录成功。
Gin 框架 Session
Gin middleware for Session management
https://github.com/gin-contrib/sessionsGin 框架可以使用基于 Gin 中间件的 第三方模块 处理
Session。gin-sessions支持多种后端存储Sessioncookie-based
Redis
Memcached
MongoDB
Memstore
Download and install:
| |
- import:
| |
- 例子:
| |
- html 文件
| |
| |
| |
gob 序列化
标准库
gob是golang提供的 “私有” 的编解码方式, 它的效率会比json,xml等更高, 特别适合在Go语言程序间传递数据。例子:
| |
- 输出:
| |
gin-session 的 gob 问题
使用
gin-session的时候报错:- securecookie: error - caused by: securecookie: error - caused by: gob: type not registered for interface:
自定义类型或高级对象
- securecookie: error - caused by: securecookie: error - caused by: gob: type not registered for interface:
需要解决以上错误,需要对
gob.Register(自定义类型或高级对象)类型进行注册。错误例子:
| |
- 输出:
| |
- 修改后的例子:
| |
Cookie 与 Session 优劣
Cookie数据存放在客户端(浏览器等..),Session数据放在服务器端(内存、关系型数据库、Redis、Memcache等)。Cookie不是很安全, 别人可以分析存放在本地的Cookie并进行Cookie欺骗 考虑到安全应当使用Session。Session会在一定时间内保存在服务器上。当访问增多, 会比较占用你服务器的性能 考虑到减轻服务器性能方面, 应当使用Cookie。单个
Cookie保存的数据不能超过4KB, 很多浏览器都限制一个站点最多保存20个Cookie。将登陆信息等重要信息存放为
Session、其他信息如果需要保留, 可以放在Cookie中。