SpringBoot集成redis+cookie实现分布式单点登录

前言

因为涛哥刚进入公司,易哥在开发一个系统的迭代版本。

现在有一个问题是考虑到在分布式部署时,移动端和PC sessionid的不同要实行单点登录和数据的共享。

让我想想该如何实现,首先我就想到的是用redis,然后又去考虑什么异地登录的情况。

结果回来通宵用jwt+redis+cookie集成实现了,刚开始想的也是直接在地址栏输入然后后台界面校验登录状态。

后来发现思维有点混乱,想想倒不如重新想想。

然后自己理清思路,决定用uuid+redis+cookie来实现。

最后也就有了现在的最终版。

做了无数代码修改和程序调试终于成功了,真是功夫不负有心人啊!

单点登录 SSO(Single Sign On)

什么是单点登录?

单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。

我们可以这样理解,在一个服务模块登录后,其他模块无需再登录

实现方式

  • session广播机制实现(老方法) ​ 当模块较多时,比较浪费资源;数据冗余,存在多份一样的数据​ session默认过期时间30分钟
  • 基于cookie+redis实现
    ​ 在项目中任何一个模块登录后,把数据放到两个地方​ redis:key:生成唯一随机值(ip、用户id等) value:用户数据​ cookie:存放redis生成的key值放到cookie​ 访问其他模块,发送请求带着cookie进行发送,服务器获取cookie值,在redis中查询,根据key进行查询,如果找到就是登录状态
  • 分布式session方式实现单点登录
    流程运行:(1) 用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式Session;(2) 用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页;(3) 一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息;(4) 存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;结合Cache中间件,实现的分布式Session,可以很好的模拟Session会话。
  • token验证
    在项目某个模块进行登录,登录之后,按照jwt规则生成字待串,把登录之后用户包含到生成字符串里面,把字符串返回
    (1)可以把宁符串通过cookie返回
    (2)把字符串通过地址栏返回前端收到token之后将token存储在自己的请求头之中或者url后面,这样每次请求都可以带着token请求。再去访问项目其他模块,获取地址栏或者请求头里面的token,根据宇符串获职用户信息。同时为了设置失效时间,可以将token放在redis中,设置失效时间,判断过期。
  • CAS 中央认证服务

开发技术

  • SpringBoot
  • Redis
  • Cookie

涛哥单点登录实现流程

  1. 用户在登录时,登录成功以后由uuid生成token访问令牌
  2. 将访问令牌存在cookie中,cookie设置有效时间30分钟
  3. 将用户信息存储在redis里面,设置有效时间30分钟,以key-value形式,token作为key,登录成功后的用户信息作为value
  4. 访问时通过拦截器拦截请求,获取token是否为null,为null为第一次登录
  5. 将token拿到redis里面去比对是否存在该键若存在完成登录验证后,放行执行访问请求

实现案例

实现效果:使用nginx做轮询分发请求,在任何一个服务登录成功以后,在访问其他服务时就不需要再去登录

1,首先创建一个boot项目

2,导入pom依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
复制代码

3,配置核心文件

注意这里是分布式就需要启动两个服务,这里就有两个配置文件

server:
  port: 8081
## redis
#session存储类型
spring:
  application:
    name: redis_cookie
  redis:
 
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值