1.背景
HTTP是无状态的。用户登陆网页访问服务器,登陆成功后关闭网页,再次打开网页访问服务器,此时仍然需要登录。
简单的做法是可以让浏览器记住用户名和密码登陆时进行自动填充,不过有风险比如电脑被黑(不过像我这种人畜无害的,黑客估计也盯不上我),但是这样退出网页后还是得登陆。
因此关键的还是要处理HTTP无状态的问题。即浏览器要在登陆成功后发起的每次HTTP请求携带用户登陆状态。这里用到的技术就是Cookie。
2.Cookie
但如图将用户名密码都保存在浏览器Cookie里是有风险的(同上),因此引入Session。
3.Session(会话)
浏览器与服务器交互就是一个Session,Session有着唯一标识Session ID和过期时间。用户登陆成功后服务器会生成一个Session,并将用户信息存储到Attribute(就是一个map结构,可查看源码),然后服务器返回响应携带Set-Cookie让前端设置Session ID和过期时间等字段。前端之后发送请求都会携带Cookie,后端根据请求中的Session ID获取Session,若获取失败直接返回;若获取成功则从Session中的Attribute获取用户信息,若结果为空则直接返回;若不为空表明验证通过,服务器会继续执行处理请求逻辑。
总结:Cookie一般保存在浏览器,存储着Session ID和Session过期时间等,随着过期时间清除;Session一般保存在服务器内存,随着服务器关闭/重启会清除,或者随着会话过期时间清除,或者业务逻辑主动删除(比如退出登录等)。