Go Web 学习笔记(七)会话控制


Go Web 会话控制

由于 http 协议是无状态的,导致服务器并不能够了解到当前用户的信息。

因此便有了一些用户进行用户会话控制的方法:cookie&session

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)

方法二:

直接使用 httpSetCookie 方法(推荐):

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")
  • 广告推荐
  • 免登陆

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 框架来实现相应的功能。