会话管理

http协议中,我们了解到了,http每次请求都是握手/挥手,第二次和第一次请求时没有任何关联的,属于无状态协议,那么问题来了,既然http是无状态协议,那服务器是怎么区分不同的用户的呢?,这就是会话了

基础讲解

服务器能区分用户的原理主要就是在于会话,每次发起http请求时,都附加上一条身份识别数据,例如下面这个http请求头:

  1. GET / HTTP/1.1
  2. Host: www.easyswoole.com
  3. Connection: keep-alive
  4. Pragma: no-cache
  5. Cache-Control: no-cache
  6. Upgrade-Insecure-Requests: 1
  7. User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36
  8. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  9. Accept-Encoding: gzip, deflate, br
  10. Accept-Language: zh-CN,zh;q=0.8
  11. Cookie: Hm_lvt_4c8d895ff3b25bddb6fa4185c8651cc3=1541986142,1542074627,1542158990,1542252497; Hm_lpvt_4c8d895ff3b25bddb6fa4185c8651cc3=1542252498

抛开http本身需要的数据,我们讲解下:

  1. User-Agent: 用户端信息,浏览器的各种信息
  2. Cookie: cookie会话

服务端可以通过User-Agent获得用户的浏览器信息,可以通过cookie获取自定义的信息
所以我们可以:

  • 用户A第一次进入,没有附带cookie
  • 服务端记录这个用户,响应头增加一个set_cookie:id=1的cookie
  • 浏览器获得响应头,解析到set_cookie动作,把id=1存进cookie
  • 第二次请求服务端,带上id=1的cookie,服务端就可以知道:这次请求时用户A请求的
  • 同理,用户B第一次进入,服务端响应set_cookie:id=2

可以看出,只要用户端每次请求,跟服务端约定好一个参数作为用户标识,服务端就可以通过这个标识区分不同的用户了