当前位置: 首页 > news >繁体>SpringBoot 分布式session

SpringBoot 分布式session

SpringBoot 分布式session实现


1. 什么是分布式session

在集群环境中,不得不考虑的一个问题是用户访问产生的session如何处理。如过不做任何处理,用户将出现频繁俸禄的现象,比如集群中存在A、B两台服务其,用户第一次访问网站时,Nginx通过负载均衡机制将用户请求转发到A节点,这时A节点就会给用户创建一个session。当用户第二次发送请求时,Nginx将其转发到B节点,这时B并不存在Session,所以就将用户踢回登陆页面。

2. 分布式session的常用方式

  • session Replication (session复制)
    原理:任何一个服务器节点上的session发生改变,该节点会把session的所有内容序列化,然后广播给所有其他节点,以此来保证Session同步。这种方式需要web容器支持分布式。
  • 粘性session
    原理: 在用户第一次请求时,Nginx将用户请求转发到A节点,那么用户以后的每次请求都会转发到A节点,相当于把用户和A节点绑定在一起。
    优点: 不需要对session做任何处理
    缺点: 缺乏容错性,当A节点发生故障,用户请求被转移到B节点,session将失效。需要Nginx添加配置支持粘性session
upstream mycluster{#这里添加的是上面启动好的两台Tomcat服务器ip_hash;#粘性Sessionserver 192.168.22.229:8080 weight=1;server 192.168.22.230:8080 weight=1;
}
  • session集中式共享
    原理: web容器不对session做任何存储,session读写都直接从Redis等分布式缓存中拿Session信息。
    有点: 可容错,session实时响应。
    缺点: 实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入。

    3. SpringBoot 分布式session实现(以redis为例)

    基于Redis的分布式session方案
  • 项目中使用:
    pom.xml
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

bootstrap.yml

spring:session:store-type: redisredis:namespace: org.dragonfei:${spring.application.name}
  • Spring-session 高层抽象结构:

SpringSession高层抽象

  • spring-session无缝替换request的原理:

    自定义Filter,实现doFilter方法;
    继承HttpServletRequestWrapper、HttpServletResponseWrapper类,重写getSession等相关方法;
    将自定义的request和response对象,传递到过滤器链;
    把该filter配置到过滤器链的第一个位置上。

  • spring-session类结构图:
    SpringSession核心类图

  • 核心实现:
    springsession核心实现
    最关键的数据结构,为hmap的结构,sessionId:{key1:"bb",key2:"cc"}

转载于:https://www.cnblogs.com/dragonfei/p/spring-session.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18349.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 9,求整数的二进制中1的个数《剑指offer》
  • FastJson(阿里巴巴)基础
  • struts入门实例
  • 软件工程第二次作业——个人项目
  • C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
  • 《结对-航空购票系统-开发环境搭建过程》
  • 20170831_安装软件
  • 寻找Harris、Shi-Tomasi和亚像素角点
  • qemu模拟器下编译运行基于riscv指令集的Linux操作系统
  • C# 文件上传
  • loadrunner要点总结
  • Spark总结1
  • 第一次作业_U201410737 _万学远
  • Eclipse在当前行之上插入一行
  • Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
  • Git 分支及bug分支合并
  • C#参数详解
  • C#给图片加文字水印
  • Appium+python自动化17-启动iOS模拟器APP源码案例
  • sql server使用的注意点及优化点 自备
  • JDK编码
  • AssetPostprocessor.OnPreprocessModel
  • dedecms织梦让channelartlist标签支持currentstyle属性
  • 从github下载的项目如何运行??---------本文以vue的项目为例
  • openwrt源码下载移植
  • DC guide ---3
  • [hiho1160] 攻城略地
  • 题目整理0924
  • lumen安装后输出hello world
  • JS--微信浏览器复制到剪贴板实现
  • 网络对抗实验一
  • Vue-cli proxyTable 解决开发环境的跨域问题
  • HIVE基础操作
  • [Python] Different ways to test multiple flags at once in Python
  • vue实现侧边栏手风琴效果
  • js获取元素,窗口的宽度、高度
  • cCupcake---ToFu
  • 在Linux上显示某个进程的线程的几种方式
  • Yii2 upload
  • HDU 2014 - 青年歌手大奖赛_评委会打分
  • Cent OS 下 VI 使用方法
  • 10.5~10.6复习与预习的进行
  • 神奇DP [HNOI2004] 打砖块
  • junit搭配hamcrest使用
  • weblogic查看版本号教程
  • shell脚本需求
  • lightoj 1382 - The Queue(树形dp)
  • 利用GDAL进行工具开源化改造
  • Git相关操作一
  • Centos干净卸载apache-php-mysql