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.Context
c.SetCookie
设置Cookie
c.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/sessions
Gin 框架可以使用基于 Gin 中间件的 第三方模块 处理
Session
。gin-sessions
支持多种后端存储Session
cookie-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
中。