持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
一、Go与Cookie
Cookie通常用于判断请求是否来自同一个客户端,设置cookie的过程一般是服务器产生cookie,发送给客户端来存储,客户端下次访问就会拿着这个cookie去访问服务器,从而使服务器“记住”这个客户端。
Cookie的数据结构包含Expires(cookie过期时间,绝对时间)、MaxAge(cookie过期时间,使用相对时间,考虑到不同浏览器的兼容性,有时候需要同时设置这两个属性)、Secure属性(安全传输,为true时只有https才能传输该cookie)、HttpOnly(为true时,不能通过js读取该cookie的值)
设置与获取cookie
Go语言通过SetCookie()函数来设置cookie,应在具体数据返回之前设置cookie,否则cookie设置不成功。
Cookie的获取可以使用Cookie()或Cookies()方法,其中Cookies()方法返回一个Cookie切片,可以返回请求中所有的cookie,而Cookie()需要传入name,获取名为name的cookie。向请求中添加cookie可以使用AddCookie()方法。
cookie := http.Cookie{
Name: "sessionid",
Value: url.QueryEscape("1234567abc"),
}
user_cookie = cookie.String()
w.Header().Add("Set-Cookie", cookie.String())
二、Go与session
Session是服务器为用户开辟的专属空间,存储结构为ConcurrentHashMap,可以使用session存储用户在一个会话期间的操作,另外session也可以判断请求是否来自同一个会话。一般会用sessionid来标记session空间,而sessionid也会存储在cookie中通过编码加密等操作传递给客户端浏览器。
在实战中推荐使用Web框架中的session方案。
session的创建
- 生成sessionid
- 开辟存储空间,数据库或者内存。
- 将sessionid发送给客户端浏览器。
将sessionid发送给客户端的方式有两种,存储到Cookie中或者URL重写。后者通常在用户禁用cookie时使用。
实现session主要考虑几点:
- Session创建
- 全局的Session管理器
- Session的存储方式
- 处理过期的Session
- Sessionid的唯一性