Session工作原理

news/2024/9/22 14:41:21/

session用于服务器和浏览器在建立会话后创建的一个唯一凭证,当多个用户访问同一个服务,就会创建多个session在服务器端保存,这些session通过sessionManager来管理,每个session相当于一个map可以设置多个值存储当前浏览器会话设置的信息,session创建后会返回给浏览器唯一凭证sessionId,它会保存在cookier当中的请求路径域名下,以JSESSION为key保存sessionid值,当下次请时会携带cookie下的指定地址下cookie的数据到服务器中查询session是否存在,存在判断是否登陆并获取登陆的用户信息,当浏览器关闭后就cookie就会失效,用户重新登陆继续会话,服务端的session默认保留30分钟,当你不适用上次的seeion后会30分钟会销毁,这个时间可以在web.xml中设置时间,主动失效要么服务器关闭要么使用invalidate()才会失效,或者等带指定的时间失效,sessionManager帮我们管理,session会默认在指定的域名下工作,跨域名共享数据就会失败。

这些在单体项目中跨请求地址可以获取共享的数据,但在多体项目携带session到其他服务中就会完全失效。seesion工作原理就好比办理银行卡,第一次使用身份证建立会话,银行返回给你一个卡号,你下次拿着卡号,银行直接可以根据卡号和当前保存的卡号系统就能直接工作,卡号就是存在浏览器cookie中的sessionId,卡号系统就是管理的session,每个人都可以申请到自己的session,根据seesion直接会话。

 解决方案:1多个微服务对session同步复制,不建议采取因为复制开销大网络带宽受影响  2使用一致性hash对ip或者域名hash获取整数然后再根据相同服务的数量取余操作,那么请求负载到只有一个相同的服务,当水平扩容的时候不一致,session也会有失效时间不会有所影响 3使用公共存储介质,将共享数据存储在mysql/redis中,当跨服务时可以直接让当前服务查询mysq或redis存的session信息,后端统一存储session比较安全,容易扩展,缺点有网络交互连接redis。总结解决方案可以使用一致性hash或后端统一处理,一致性hash比较麻烦,支持第二种方案。

统一存储session解决方案,spring提供springSession框架,session共享问题解决-不同服务,子域名session共享,子域session共享,如a.bowen.com获得session后可以在请求页看到cookie保存的信息,在b.bowen.com看不到上一个保存的cookie信息,要共享a的cookie就要修改a的作用域domain的地址比如将的实体作用域a,bowen.com修改为.bowen.com在b.bowen.com地址页检查cookie就会存在相同的cookie信息。那么浏览器就能跨不同的域名共享这个session,担是不能在浏览器中修改,在服务器第一次发放session时就应该扩大session的作用域,让浏览器端不同域名下符合cookie匹配的路径都能共享cookie,子域发放的seesion所以的父域名都可以使用。

httpServletResponse.addCookie(new Cookie("JSESSION",data).setDomain(" ")) spriingSession

实现的方式如此,自己添加较为麻烦。这也客户端的cookie就能共享,请求服务携带上cookie去redis查询数据。

整合springsession引入依赖:

  <!-- 整合springsession --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>

配置文件配置属性值,启动类开启springSession功能。


http://www.ppmy.cn/news/1430908.html

相关文章

【刷题笔记】第七天

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)方法一&#xff0c;并查集方法二&#xff0c;dfs [GCD and LCM ](https://vjudge.net.cn/problem/HDU-4497#authorKING_LRL) 924. 尽量减少恶意软件的传播 如果移除一个感染节…

地方政府专项债发债全过程-梳理

地方政府专项债发债全过程-梳理 一、什么是专项债&#xff1f; 地方政府专项债券&#xff08;以下简称“专项债券”&#xff09;&#xff0c;是指省、自治区、直辖市政府为有一定收益的公益性项目&#xff0c;发行的、约定一定期限内以公益性项目对应的&#xff0c;政府性基金…

Linux之命令行参数的原理以及实现,环境变量限时增加删除和永久增加删除以及代码获取环境变量

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 一.命令行参数 1.1main函数参数 在我们学习c语言时我们的main函数…

【ZZULIOJ】1076: 三位数求解(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 已知xyzyzzn&#xff0c;其中n是一个正整数&#xff0c;x、y、z都是数字&#xff08;0-9&#xff09;&#xff0c;编写一个程序求出x、y、z分别代表什么数字。如果无解&#xff0c;则输出“No…

30s搞懂HashSet基本原理与方法

目录 1.原理 1.1 基于HashMap实现 1.2 实现了Set接口 1.3 实现了序列化和可克隆化 2.实现操作 2.1 添加元素add() 2.2 删除指定单个元素remove() 2.3 删除所有元素clear() 2.4 判断是否包含元素contains() 2.5 判断是否为空isEmpty() 2.6 获得大小size() 2.7 遍历H…

学习前端第二十三天(函数表达式,箭头函数,对象)

一、函数表达式 // 普通函数允许先调用后定义&#xff0c;函数表达式不行 // 普通函数的函数名可以重复&#xff0c;后面的定义的同名函数覆盖前面的&#xff0c;函数表达式不行 // 代码块内的普通函数全局可见&#xff0c;函数表达式只有在代码块中可见 无论如何&#xff…

学术论文中常见的拉丁语及其缩写词汇解析

诸神缄默不语-个人CSDN博文目录 在学术写作中&#xff0c;作者经常会使用一系列的拉丁语及其缩写词。 1. et al. 全称&#xff1a; et alii 或 et alia意义&#xff1a; 和其他人使用场景&#xff1a; 当引用的文献有多个作者时&#xff0c;通常在第一作者后使用“et al.”表…

在stm32中,所需的库函数有那些

使用库函数中封装的函数来访问外设可以使得stm32开发更加方便&#xff0c;省去了查寄存器位操作&#xff0c;只用查库函数就可以了 但是使用库函数时要记住真正的其本质是获取寄存器的地址然后设置其中的位 库函数一般添加到自己创建的Lib文件夹中 库函数实际上分成了两块&…