首页 > 编程知识 正文

分布式session共享,session

时间:2023-05-06 03:13:09 阅读:32051 作者:1780

本系列教程作为团队中的培训材料提供。 主要通过实验体验SpringSecurity的各功能。

分布式集群体系结构中的Session共享通常有以下实现方案:

在Session复制群集中的任何服务器上修改(添加或删除) Session时,该节点将序列化该Session的所有内容并向所有其他节点广播,以实现Session同步。

Session粘滞利用Ngnix负载平衡策略的ip_hash机制将一个ip的所有请求发送到同一服务器。 也就是说,以流量的分发为方向。 这实际上不存在Session共享,只是实现了用户请求和服务的结合。

Session持久化通过集中存储所有Session并将其存储在数据库中来确保Session的持久化,但发现随着用户数据量(活动)的增加,查询数据库开销也会增加

Session共享集中存储所有Session,使用Redis等分布式缓存方式缓存Session,实现Session共享,查询效率高,还可以向外扩展。

显然,在这四个方案中,实际使用的是最后一个方案。 基于分布式缓存(eg: Memcached,Redis )的会话共享。 今天我给你看这个剧本。

创建了一个名为SpringBoot-security-session的新springboot项目。 核心取决于Web、SpringSecurity、SpringSession和Redis。

pom是dependenciesdependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-web/artifact id/依赖的ependencydependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-security/artifact id ependencydependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-data-redis/artifact id ependencydependencygroupidorg.spring framework.session/groupidartifactidspring-session-data-redis/artififation ependencydependencygroupidorg.project lombok/groupidartifactidlombok/artifactidoptionaltrue/optional/ependencydependencygroupidorg.spring framework.boot/groupidartifactidspring-boot-starter-test/artifactidscopetesest dependencies配置文件server : port :8000 spring : redis :10.16.1.110 port 3:6379 poopt 33608 pool.max-wait :-1 password : time out :1000资源接口创建资源接口:登录后的默认跳转/显示当前服务的端口号

@ restcontrollerpublicclassessioncontroller { @ value (' $ { server.port } ) Integer port; @getmapping(value='/' ) public String greeting ) (returnstring.valueof ) port ); (实验0 )伪分布式集群Session共享两个服务并打开:

一个在8000个端口上运行。 http://localhost:8000个在9000端口上运行。 http://localhost :9000 note :在idea中,可以在以下配置中同时运行服务的多个实例:

实验步骤:

通过浏览器先访问http://localhost:8000,此时请求登录,输入用户名: user,密码由控制台生成; 成功登录后,为8000; 然后,继续在当前浏览器中打开新选项卡,访问http://localhost:9000。 意外地,就这样显示。 (不需要再次登录。 ) 9000; 这依赖于spring-Session-data-redis实现会话共享(不映射)。 Note :

由于仍然采用传统的Cookie-Session模式,因此上述实验必须在同一浏览器中进行,请求时浏览器会自动自带Cookie。 其中包含SessionID。 在实际生产中,通常通过Nginx进行反向代理,只对外提供一个域名或接口地址,再次验证实现集群负载平衡的实验Session共享向控制器添加两个接口。 一个是写入键值对,另一个是读取键值,接口如下。

@ restcontrollerpublicclassessioncontroller { @ value (' $ { server.port } ) Integer port; @getmapping(value='/' ) public String greeting ) (returnstring.valueof ) port ); } @ get mapping (value='/session/set ' ) publicstringsetsession ) http session session.set attribute )密钥返回} @ get mapping (value='/session/get ' ) public string getsession (http session session ) object value=session.getater ririon }实验步骤:

在浏览器中访问http://localhost :8000/session/set时,8000: Session updated . 然后,如果继续在当前浏览器中打开新选项卡并访问http://localhost :9000/session/get,出乎意料地,9000:value; 这将实现自定义键值对的Session共享。 sourcecodegithubreferencespringsecurity官方文档If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。