Go使用session和cookie

103 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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的唯一性