C/S交互的会话管理

仅代表本人的浅薄理解,如有错误,欢迎指正!

HTTP

HTTP是无状态的协议,每次请求都是独立的,前后没有关系。
但是我们可以通过cookie和session等技术来实现有状态的会话机制。

当客户端向服务器发送一个请求后,服务器会创建一个对应的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的使用有以下几个方案:

  1. 粘性session:将同一个IP请求分给固定的服务器,这时会出现负载不均衡,有可能一个服务器负责的请求很多,而其他很少;
  2. 同步session:一个服务器创建了session,将与其他服务器进行同步,所有服务器都会创建这个session来接收该用户接下来的请求,
    这时服务器之间会出现耦合,服务器压力自然也会增大,影响性能,且分布式也失去了他的意义;
  3. 共享session:专门用一个服务器来存放session并处理会话请求,这时该服务器是单体服务器,该服务器嗝屁了直接影响整个系统!

了解到的主流解决方案,是尽量将cookie存放在客户端,敏感数据存放在数据库集群中(MySQL集群或Redis集群)。

posted @   Shineloner  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示