C/S交互的会话管理
仅代表本人的浅薄理解,如有错误,欢迎指正!
HTTP
HTTP是无状态的协议,每次请求都是独立的,前后没有关系。
但是我们可以通过cookie和session等技术来实现有状态的会话机制。
Cookie
当客户端向服务器发送一个请求后,服务器会创建一个对应的cookie,并返回给客户端,cookie在响应头中。
接下来客户端在次发送请求的时候会在请求头中加上这个cookie,这样客户端与服务器通过HTTP的交互就有了联系。
cookie保存在客户端的内存中,客户端关闭,cookie就会消失,设置cookie的生存时间就可以为cookie续命(会保存在硬盘等存储介质中)!
代码Demo
public void setCookie(HttpServletResponse response) {
//创建cookie
Cookie cookie = new Cookie("cookie_name", "cookie_value");
//设置生存时间
cookie.setMaxAge(int time);
//将cookie存入response对象,响应给客户端
response.addCookie(cookie);
}
Session
Session是JavaEE的标准,是在服务端记录客户端的信息,敏感信息保存在服务器端,更安全,但是也会给服务器带来压力,影响性能。
服务器保存一块Session数据,响应给客户端的响应头中在cookie中添加了JSESSIONID数据。
代码Demo
public void setSession(HttpSession session) {
//为session域添加name和value
session.setAttribute("name", "value");
}
使用分布式部署时,使用session会有什么问题?
分布式架构,客户端访问的是nginx代理服务器,该服务器负责真正的服务器的负载均衡。
session的使用有以下几个方案:
- 粘性session:将同一个IP请求分给固定的服务器,这时会出现负载不均衡,有可能一个服务器负责的请求很多,而其他很少;
- 同步session:一个服务器创建了session,将与其他服务器进行同步,所有服务器都会创建这个session来接收该用户接下来的请求,
这时服务器之间会出现耦合,服务器压力自然也会增大,影响性能,且分布式也失去了他的意义; - 共享session:专门用一个服务器来存放session并处理会话请求,这时该服务器是单体服务器,该服务器嗝屁了直接影响整个系统!
了解到的主流解决方案,是尽量将cookie存放在客户端,敏感数据存放在数据库集群中(MySQL集群或Redis集群)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端