分布式Session

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 分布式Session


1、Session原理

服务器为了表示是哪个用户,在用户第一次登陆成功后将用户信息保存在session中,并且命令浏览器保存一个jsessionid = value的cookie,并且该浏览器每次访问想访问的服务的功能的时候都带着cookie,但是浏览器关闭后就会清楚cookie,下次访问的时候没有jsessionid就会再去重复步骤。

2、 分布式Session要解决的问题

在分布式情况下一般会使用一般的Session会造成两个问题:

  • 同一服务下,Session要复制多份,这样才能保证每个服务有相同的Session
  • 不同服务下,Session是有作用域的。
    解决方法:
  • session复制
  • cookie本地化
  • hash一致性:根据ip进行hash取余,将ip负载均衡到不同的服务器
  • 统一存储,将所有Session都统一放在redis中,进行统一管理,缺点:增加了网络成本 优点:保证了数据安全

3、 整合SpringSession解决分布式Session问题

引入依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

加入配置

session:
  store-type: redis
  timeout: 30m

主启动类

@EnableRedisHttpSession
@Configuration
public class GulimallSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        //放大作用域
        cookieSerializer.setDomainName("gulimall.com");
        cookieSerializer.setCookieName("GULISESSION");
        return cookieSerializer;
    }
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

4、核心原理

  • 建立一个认证服务器,当其他服务需要登陆操作的时候就带着登陆后需要重定向的地址转发到认证服务器上进行登陆,登陆成功后设置一个uuid或者由ip、用户id等等随机生成的token,将token保存到cookie中,并将这个token和对应的用户信息以key-value的形式保存到redis中,并带着token重定向到指定url。
  • 需要登陆的服务器拿到认证中心返回来的token,将这个token也保存到cookie中,并向redis查询出对应的用户信息保存到自己的session或cookie中完成登陆。
  • 因为浏览器每次发送请求都会带着cookie去发送,因此在用户登陆成功后每次请求都带着token,所以可以通过服务器端建立一个filter来判断是哪个用户发送的请求。
  • 当其他未登录的模块需要登陆的时候,也转发请求带着回调地址发送给认证中心,如果认证中心cookie中有其他已登录模块存留的cookie那么认证中心就将这个token返回给该模块,该模块拿到后再根据token找redis拿用户数据,将token和数据存到自己的cookie或者session中,完成登陆。
  • 这样就实现了多个微服务之间的单点登陆的操作。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
负载均衡 算法 NoSQL
分布式系列教程(15) - 解决分布式Session一致性问题
分布式系列教程(15) - 解决分布式Session一致性问题
59 0
|
9月前
|
存储 缓存 NoSQL
Shiro 解决分布式 Session
在分布式系统中,会话管理是一个重要的问题。Shiro框架提供了一种解决方案,通过其会话管理组件来处理分布式会话。本文演示通过RedisSessionManager解决分布式会话问题。
56 0
|
6天前
|
存储 前端开发 程序员
|
8月前
|
存储
13JavaWeb基础 - Session技术
13JavaWeb基础 - Session技术
18 0
|
8月前
|
存储 NoSQL Java
场景应用:利用Redis实现分布式Session
场景应用:利用Redis实现分布式Session
557 0
|
12月前
|
存储 负载均衡 算法
分布式session
1.什么是session HTTP是无状态的,session是一种会话保持技术,目的就是以一种方式来记录http请求之间需要传递、交互的数据。 不是每次http请求都会产生的新的session,而是在服务端手动创建的,例如HttpServletRequest.getSession(true)。 session创建后会返回给客户端sessionID,sessionID会以cookie的形式携带在后续的请求中,直到浏览器关闭,一次会话结束。
42 0
|
存储 NoSQL Java
分布式session的几种解决方案,你中意哪种?
在分布式环境下,session就会出现问题了,假如服务端部署在两个服务器A和B上。第一次往购物车添加商品时,请求落在了服务器A上,服务器A创建了一个session,并返回JessionId,第二次往购物车添加商品时,请求落在了服务器B上,请求携带的JesssionId在服务器B上并不会找到对应的session。这时候服务器B就会创建一个新的session,并返回对应的JessionId,客户端发现第一次添加的商品丢失了。。。
912 0
分布式session的几种解决方案,你中意哪种?
|
NoSQL Redis
基于shiro实现session持久化和分布式共享(3)
基于shiro实现session持久化和分布式共享(3)
166 0
基于shiro实现session持久化和分布式共享(3)
|
缓存
基于shiro实现session持久化和分布式共享(1)
基于shiro实现session持久化和分布式共享(1)
214 0
基于shiro实现session持久化和分布式共享(1)
|
存储 缓存 NoSQL
基于shiro实现session持久化和分布式共享(2)
基于shiro实现session持久化和分布式共享(2)
328 0
基于shiro实现session持久化和分布式共享(2)