IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> session 共享 -> 正文阅读

[Java知识库]session 共享

session原理

在这里插入图片描述

  1. 用户使用浏览器第一次登录服务器成功后,服务器会创建 session 保存用户相关信息
  2. 接着服务器命令浏览器保存一个 jsessionid(作用域默认为当前访问服务器的域名),该jsessionid用于之后访问服务器时,拿到保存在 session 中的相关信息
  3. 再次访问服务器时,携带jsessionid,无需登录。因为根据jsessionid可以取到相关 session 信息
  4. 如果关闭浏览器,并清除 cookie(jsessionid保存再cookie中),再次向服务器发起访问时,这时候由于没有 jsessionid ,需要转到步骤1,重写发起登录。

分布式环境下,session 不共享问题

  1. 同域名下 session 不能共享问题
    在这里插入图片描述
  2. 不同域名下,session 不能共享问题
    在这里插入图片描述

分布式环境下,解决 session 共享问题

同域名下 session 共享问题解决
  • 方案1,session 复制
    在这里插入图片描述

    优点:tomcat 原生支持 session复制,只需要修改配置文件即可
    缺点:

    1. session同步需要数据传输,占用大量网络带宽,降低服务器的业务处理能力
    2. 需要较多内存,无法水平扩展更多的 web-server。因为每台 web-server 都需要存储所有 session数据
  • 方案2,客户存储 session (这种方式不会使用,提供一种思路)
    在这里插入图片描述

    优点:服务器不需要存储 session,用户保存自己的 session 信息到 cookie 中,节省服务器资源
    缺点:

    1. 每次 http 请求都需要携带 cookie中的完整信息,浪费网络带宽
    2. cookie长度有 4k限制,所有 session不能太长
    3. session 数据存放在cookie中,存在泄漏,篡改,窃取等安全隐患
  • 方案3,一致性hash
    在这里插入图片描述

    优点:

    1. 只需要配置 nginx,不需要修改代码
    2. 只要被hash的字段字分布均匀,那么每台web-server的负载就是均衡的
    3. 可以支持web-server水平扩展

    缺点:

    1. session 存在web-server 中,web-server 重启导致部分 session 丢失,影响业务。如部分用户需要重写登录
    2. web-server水平扩展后,rehash后session重写分布,也会有部分用户路由不到正确的 session,因此需要重写登录

    这些缺点的问题不大,因为session本来就是有有效期的。因此这种反向代理方式可以使用。

  • 方案4, 统一存储到DB或者Redis中
    在这里插入图片描述

    优点:

    1. 没有安全隐患
    2. 可以水平扩展
    3. web-server重启或者扩容,都不会有session丢失

    缺点:

    1. 增加了一次网络调用,需要修改业务代码,如将所有的 getSession 方法替换为从Redis中查询数据
    2. 从 redis 获取数据比从内存中慢

    上面的缺点,可以用 SpringSession解决

不同域名下,session 共享问题

在这里插入图片描述

  1. 访问商品服务完成后,服务器命令浏览器保存 jsessionid 到 mall.com 域名下,(默认保存会保存在product.mall.com域名下,服务可以将jsessionid的作用域放大到父级域名 mall.com)
  2. 访问订单服务,此时会携带jsessionid,因为 order.mall.com 域名为 mall.com 域名的子域名,而jsessionid保存在 mall.com域名下,因此,访问 mall.com下的所有子域名,都会携带jsessionid。

如此,解决不同子域名下,session共享问题。

分布式情况下,使用 SpringSession 实现同域名和不同子域名 session 共享

参考 https://docs.spring.io/spring-session/docs/2.5.1/reference/html5/#httpsession-redis

  1. 添加依赖
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  2. application.yml文件中配置
    spring:
      session:
        store:
          type: redis
    # 调整 session 的过期时间      
    server:
      servlet:
        session:
          timeout: 30m
    
  3. Spring Boot 帮我自动创建了 springSessionRepositoryFilter

    Our Spring Boot Configuration created a Spring bean named springSessionRepositoryFilter that implements Filter. The springSessionRepositoryFilter bean is responsible for replacing the HttpSession with a custom implementation that is backed by Spring Session.

  4. 添加注解 @EnableRedisHttpSession 确保 SpringSession 来管理 HttpSession
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:29:41  更:2021-08-06 09:30:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 2:06:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码