SpringSession单点登录(Single Sign On)

什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,企业间需互相授信。

                -->微服务

客户端-->-------------<--sso服务

                -->微服务

一、    分布式系统 Session 共享方案
 

1    分布式系统中 HttpSession 的不足(基于服务器的全局变量)


在分布式项目中,HttpSession 状况?

用户如果访问的是 Tomcat-A 产生自己的 Session 时,如果再次访问 Tomcat-B,默认情

况下在 TomcatB 中重新创建 Session 对象,而不会把 TomcatA 中的 Session 共享过来。


实际场景:用户访问 TomcatA 实现了登录,在 Session 作用域中存储当前用户信息,后

面通过 nginx 代理或一些负载均衡工具有可能在访问过程中访问 TomcatB,TomcatB 中没有用户 Session 对象也没有用户登录信息,对于之前登录状态就失效。

而分布式项目中每个模块是一个独立项目,每个项目一个独立 tomcat

2    目前市场上 Session 共享的解决方案

2.1Session 广播

通过配置 Tomcat 的配置文件,实现多个 Tomcat 之间可以相互共享 Session 状态。在以

前的时候使用这种方案。

优点:        

配置完成后,使用起来比较简单。和平时使用方式相同的。

缺点:

广播的过程性能消耗较大。每个 Tomcat 中存储大量 Session 对象。

2.2使用 Nginx 代理实现

        通过对 NGINX 进行配置,按照算法对存储在 Session 中 key 进行计算,得出固定值,把

这个 key 及 value 存储到某个 Tomcat 中,以后获取 key 的内容时再次对 key 进行计算,还是

从对应 Tomcat 中取出 Value。

优点:
        多个 Tomcat 分摊整个项目的 Session。

缺点:
        如果某个 Tomcat 出现宕机等问题会丢失数据。

2.3自定义 Session 实现(aof--rdb)


程序员通过模拟 Session 实现过程,结合 Cookie + Redis 技术进行实现。把存储在服务
器端 Session 对象中全局 Map 对象的内容变成存储到 Redis 中。整个存储 Session 的全局 Map 换成了 Redis 工具。(第一次读取数据库,第二次读取redis)

SpringSession单点登录(Single Sign On)_第1张图片

2.3.2    向 Session 作用域中存储值
 当向 Session 作用域存储值时执行上面 Session 原理,把 Session 对象取出后,Session 作用域的值就存储在全局 Map 属性(此 Map 属性是 Session 对象的全局属性)
SpringSession单点登录(Single Sign On)_第2张图片

优点:

性能较高,不存在某个 Tomcat 宕机丢失数据等问题。整体效果比较稳定。

缺点:

需要程序员自己手动完成一些列效果,实现过程相对较复杂。

2.4使用 Spring Session 实现


把上面自定义 Session 实现的整个过程进行封装成了 Spring Session 对象,程序员直接像

单体项目中操作 HttpSession 一样进行操作,剩下的所有事情都交给 Spring Session 进行处理,

最终效果依然可以实现分布式 Session 共享。

   

二、    实现 Spring Session登录 

依赖:

redis的module中



    org.springframework.boot
    spring-boot-starter-data-redis

web中加入springsession的支持



    org.springframework.session
    spring-session-core



    org.springframework.session
    spring-session-data-redis

配置文件:
spring:
  redis:
    host: 192.168.160.134
    port: 6379  #redis的默认端口

注解:

启动类开启对redis的支持
@EnableCaching 
方法上使用注解
@Cacheable(cacheNames = "com.mymaven",key = "'user'+#id")

1.@Cacheable这个注解是表示当前类--方法可以使用

2.支持缓存

3.spring调用当前方法或者类时缓存在redis中

cacheNames = "com.mymaven"区分名字通常以公司域名填写

key:双引号里面加单引号

+ #id:用于区别服务与服务间的区别,防止被覆盖。

在redis中会显示为:com。mymaven::user id

三,使用 SpringSession 其他配置说明

SpringSession单点登录(Single Sign On)_第3张图片

 

1    @EnableRedisHttpSession注解


此注解写在启动类上的。所有属性都有默认值,可以省略不配置。

a)    maxInactiveIntervalInSeconds:单位秒,默认 1800 秒。表示 Session 存活时间。

a)    redisNamespace:存储在 redis 中 key 的前缀。默认 spring:session

a)    flushMode:刷新 redis 数据的模式。默认 ON_SAVE。在保存时才刷新。另一个取值

FlushMode.IMMEDIATE,不刷新。

d)    cleanupCron:清理过期session的频率,保持默认无需配置。默认 ”0 * * * * *”

d)    saveMode:保存模式。默认值 SaveMode.ON_SET_ATTRIBUTE SaveMode.ALWAYS:实时保存。

SaveMode.ON_GET_ATTRIBUTE:获取值时才进行保存到 redis
 

你可能感兴趣的:(redis,p2p,网络协议,网络)