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

在分布式环境下,session会存在两个问题

第一个问题:不同域名下,浏览器存储的jsessionid是没有存储的。比如登录时认证服务auth.gulimall.com存储了session,但是搜索服务search.gulimall.com是没有这个session的;

第二个问题:即使域名相同,但是分布式的服务在相同的服务里面有多个服务集群部署的,用户每次访问的时候,不能总是访问同一个服务,可能到了其他的服务,由于采用了负载均衡,有可能这次请求分发给node1服务处理,下次请求分发给node2处理,node2是没存储有node1的session的。

解决办法:

第一种方式:配置tomcat

这种的只适用于3-5个tomcat服务的时候,可以使用,在分布式情况下不适合的。

存在的问题:带宽问题,相互同步需要消耗网络传输时间。tomcat内存问题,每一个tomcat都要存储其他tomcat对应的数据消耗内存。

第二种方式:

在客户端将所有的数据存储到cookie中,但是这是存在安全隐患的对应的数据可以被修改,而且cookie存储的数据是有限的只有4K。这种一般不用。

第三种方案:

选择hash一致性,也就是用户访问的时候,总是访问同一个服务。这里是修改nginx的配置,也可以结合业务字段,sid是456就到另一台服务器,其他的到另外一台服务器。

第四种方式:

使用公共的区域进行存储session,比如redis,数据库或者存储的更快的非关系型数据库。

 下面是解决问题一的问题

解决子域共享问题

用户通过浏览器登录会员服务,会员服务会将其对应的用户信息存储到内存session中,但是这里我们不将其用户的信息存储内存session中,我们将其对应的用户的信息存储到redis。接下来给浏览器发卡,我们将其对应的域名放大,这样对应的子域名也可以可以访问对应的域名放大jessionid里面的数据。

解决方案:

引入SpringSession和使用:

需要注意:1.SpringSession有自动延期:redis中的数据也是有过期时间

                  2.哪里需要SpingSesson,哪里就需要配置。都要配置。

实现步骤:

1.添加依赖
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
2.配置文件中添加配置
spring.session.store-type=redis # Session store type.#下面的是配置可以不加,这里可以添加一个过期时间
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds is used.
spring.session.redis.flush-mode=on-save # Sessions flush mode.
spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
3.开启EnableRedisHttpSession注解:

4.添加配置类,默认使用jdk序列化,可读性差,这里系统化转成Json, 方便阅读
@Configuration
public class GulimallSessionConfig {@Beanpublic CookieSerializer cookieSerializer(){DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();//放大整个系统域的作用域,使用主域名,这样带这个的二级域名也能读取到sessioncookieSerializer.setDomainName("gulimall.com");cookieSerializer.setCookieName("GULISESSION");return cookieSerializer;}/*** 序列化机制* @return*/@Beanpublic RedisSerializer<Object> springSessionDefaultRedisSerializer() {return new GenericJackson2JsonRedisSerializer();}
}
 5.在业务代码中使用session存储用户信息
session.setAttribute(AuthServerConstant.LOGIN_USER,data);

 注意:存储到session的实体类一定要系列化,否则会报异常

public class MemberRespVo implements Serializable{}
6.前端引用:${user.nickname}

总结:需要使用SpringSession的服务依照上面的步骤实现:pom添加依赖,-->application配置类指定spring.session.story.type=redis-->添加config配置类,-->在启动类或配置类添加注解@EnableRedisHttpSession,然后在前端中进入引用即可。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

鸟类领域超大规模检测实践,基于YOLOv8轻量级检测模型开发构建超大规模生活场景下500种鸟类检测识别分析系统

关于鸟类的检测、识别相关的开发实践在前面的系列博文中也有不少的实践记录&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 【检测类】 《AI识鸟&#xff0c;基于YOLOv5【n/s/m/l/x】全系列参数模型开发构建工业野外场景下鸟类检测识别分析系统》 《基于轻量级YOL…

Eyes Wide Shut Exploring the Visual Shortcomings of Multimodal LLMs

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs 近两年多模态大模型&#xff08;Multimodal LLM&#xff0c;MLLM&#xff09;取得了巨大的进展&#xff0c;能够基于图片与人类对话&#xff0c;展现出强大的识别甚至推理能力。然而&#xff0c;在某些…

游戏AI的创造思路-技术基础-蒙特卡洛树搜索(2)

接上一篇&#xff0c;让我们来看更多的例子 目录 7. 更多例子 7.1. 国际象棋实例 7.2. RTS类游戏实例 7.3. FPS类游戏实例 7. 更多例子 蒙特卡洛树搜索&#xff08;Monte Carlo Tree Search&#xff0c;MCTS&#xff09;在游戏AI中有着广泛的应用&#xff0c;尤其是在那些…

孟德尔随机化--代谢生活方式与消化道癌

写在前面 今天阅读的文献是多种暴露与某结局的孟德尔随机化&#xff0c;算是以量取胜了。 The effect of metabolism-related lifestyle and clinical risk factors on digestive system cancers in East Asian populations: a two-sample Mendelian randomization analysis …

使用tkinter拖入excel文件并显示

使用tkinter拖入excel文件并显示 效果代码 效果 代码 import tkinter as tk from tkinter import ttk from tkinterdnd2 import TkinterDnD, DND_FILES import pandas as pdclass ExcelViewerApp(TkinterDnD.Tk):def __init__(self):super().__init__()self.title("Excel…

谷歌摸鱼神器来了:推出AI会议替身,一键总结提问发言_会议预约 ai对话

饱受会议折磨的打工人&#xff0c;终于可以解放了&#xff01; 就在刚刚举办的Google Cloud Next’23大会上&#xff0c;谷歌宣布了一系列科技新进展&#xff0c;最瞩目的要属其中的“开会AI替身”了。 只需要一句“帮我参加”&#xff0c;AI就能替你开会&#xff0c;并在合适…

设计模式探索:装饰器模式

1. 装饰器模式定义 装饰器模式&#xff08;Decorator Pattern&#xff09; 装饰器模式是一种结构型设计模式&#xff0c;允许向一个对象动态添加行为。在不改变类的接口的情况下&#xff0c;装饰器模式在原始类上增加额外的职责&#xff0c;并且支持多个装饰器嵌套使用。 装…

车载聚合路由器应用场景分析

乾元通QYT-X1z车载式1U多卡聚合路由器&#xff0c;支持最多8路聚合&#xff0c;无论是应急救援&#xff0c;还是车载交通&#xff0c;任何宽带服务商无法覆盖的区域&#xff0c;聚合路由器可提供现场需要的稳定、流畅、安全的视频传输网络&#xff0c;聚合路由器可无缝接入应急…

安装nodejs | npm报错

nodejs安装步骤: 官网&#xff1a;https://nodejs.org/en/ 在官网下载nodejs: 双击下载下来的msi安装包&#xff0c;一直点next&#xff0c;我选的安装目录是默认的: 测试是否安装成功&#xff1a; 输入cmd打开命令提示符&#xff0c;输入node -v可以看到版本&#xff0c;说…

idea创建dynamic web project

由于网课老师用的是eclipse,所以又得自己找教程了…… 解决方案&#xff1a; https://blog.csdn.net/Awt_FuDongLai/article/details/115523552

有没有适合全体质猫咪的主食冻干?全价冻干:希喂大橙罐实测分享

作为一个注重猫咪身体健康和幸福感的铲屎官&#xff0c;怎么会不喂主食冻干。毕竟&#xff0c;除了猫咪爱吃外&#xff0c;高含肉量、高营养的主食冻干也能给猫咪的健康带来一系列的好处。 最近&#xff0c;我给我家猫猫们入手了一款性价比超高的主食冻干&#xff1a;希喂CPMR2…

mybatis中的标签

在MyBatis中&#xff0c;除了基本的SQL映射功能外&#xff0c;还有许多用于动态SQL构建的标签。这些标签允许我们根据不同的条件和需求构建复杂的SQL语句。主要的动态SQL标签包括<if>, <choose>, <when>, <otherwise>, <trim>, <set>, <…

deepstream段错误

&#x1f610; 错误&#xff1a; 探针中由于使用了pyds.get_nvds_buf_surface(hash(gst_buffer), frame_meta.batch_id)导致的段错误&#xff08;segmentation fault&#xff09;。 解决方式&#xff1a;

彩带插画:成都亚恒丰创教育科技有限公司

彩带插画&#xff1a;色彩斑斓的艺术世界 在浩瀚的艺术海洋中&#xff0c;彩带插画以其独特的魅力&#xff0c;如同一条绚烂的彩绸&#xff0c;轻轻拂过人们的心田&#xff0c;留下一抹抹难以忘怀的色彩。成都亚恒丰创教育科技有限公司它不仅仅是一种视觉上的享受&#xff0c;…

二叉树超详细解析

二叉树 目录 二叉树一级目录二级目录三级目录 1.树的介绍1.1树的定义1.2树的基本术语1.3相关性质 2.二叉树介绍2.1定义2.2 性质 3.二叉树的种类3.1 满二叉树3.2完全二叉树3.3 二叉查找树特点&#xff1a;二叉查找树的节点包含的基本信息&#xff1a; 3.4 平衡二叉树 4.二叉树的…

python破解密码·筛查和选择

破解密码时可能遇到的几种情况 ① 已知密码字符&#xff0c;破排序 ② 已知密码位数&#xff0c;破字符 ③ 已知密码类型&#xff0c;破字位 ④ 已知部分密码&#xff0c;破未知 ⑤ 啥都不知道&#xff0c;盲破&#xff0c;玩完 ⑥ 已知位数、字符、类型、部分密码中的几个&am…

单链表(C语言详细版)

1. 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构跟火车车厢相似&#xff0c;淡季时车次的车厢会相应减少&#xff0c;旺季时车次的车厢会额外增加几节。…

资料分析笔记整理

提升技巧多做题、少动笔、多分析 资料分析认识 国考一般20题(24~28分钟) 统计材料的类型包括单纯的文字、表格、图形以及由这些元素组成的复合类型材料 文字性材料:(30~60秒) 多段落型文字材料(时间、关键词、结构) 孤立段落文字材料(时间、关键词、标点[。;]) 表…

VMware vSAN替换存储解决方案如何选择?

What is vSAN &#xff1f; 是一款软件定义的企业存储解决方案&#xff0c;支持超融合基础架构系统。vSAN与VMware vSphere 完全集成在一起&#xff0c;作为ESXi Hypervisor内的分布式软件层&#xff0c;通过整合、池化ESXi各个主机上的存储资源&#xff0c;为vSphere虚拟化平…

施罗德数列SQL实现

在组合数学中,施罗德数用来描述从(0,0)到(n,n)的格路中,只能使用(1,0)、(0,1)、(1,1)三种移动方式,始终位于对角线下方且不越过对角线的路径数 DECLARE n INT 10 DECLARE i INT DECLARE rst INT DECLARE old INT1CREATE TABLE #rst (i INT ,rst int )INSERT INTO #rst values(…