参考链接
分析:
1.为什么客户端关闭后,再此打开客户端,访问页面,服务端无法获取到session中key对应的value值?
2.客户的cookie的beegosessionID(sessionID)和服务端的session是如何关联的?
3.beego框架默认使用的什么session?
4.beego是如何给客户端返回beegosessionID(sessionID)的?
解答3
beego默认使用MemSessionStroe来作为服务端Session的管理
解答2,4
当Beego项目首次启动时,会设置一个叫beegosessionID的sessionName,用于服务端返回给客户端的cookie中的beegosessionID,(如图1)设置beegosessionID
(图1)设置beegosessionID
当服务端接受到客户端的请求,会判断该session是否开启,(如图2)session是否开启
(如图2)session是否开启
在SessionStart首先根据当前请求中的所包含的beegosessionID去获取对应的sid,(如图3)SessionStart内部实现
(如图3)SessionStart内部实现
SessiionExist(sid)判断sid,是否存在,如果存在,则取出对应Session,并读取,(如图4)SessionExist
(如图4)SessionExist
如果sid不存在,则从重新生成一个,并读取。根据sid去sessions获取,是否存在,不存在则生一个新的MemSessionStroe并设置sid,然后放到list中,最终返回一个MemSessionStroe(如图5)SessionRead
(如图5)SessionRead
添加cookie人(如图6)http的Cookie的设置
(如图6)http的Cookie的设置
最终的设置了当前session和cookie中的beegosessonID之间的关系(如图7)sessioin和cookie的关系
(如图7)sessioin和cookie的关系
解答1
当客户关闭再次打开浏览器进行访问项目资源时,这是又时一个新的会话,所以又会在客户单产生一个新的beegosessionID(sessionID),这时服务端会根据这个新的beegosessioinID来获取对应的session信息时,是无法获取之前的session信息。因为这个新的beegosessionID和旧的session之间是没有任何关联的。