Redis实现Single单点登入--系统框架搭建(一)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis实现Single单点登入--系统框架搭建(一)

环境需求:redis3.8.2+maven+springBoot+jdk1.8+freemarker模板


1、需求背景


周末在家,上家同事突然联系,让我给他网站做单点登入功能,于是自己先梳理逻辑,实现功能并且记录下来。


单点登入(Single sign on)顾名思义,就是在一个网站登入之后,其他网站就不需要用户继续输入账号密码,而能免密登入,这种技术在大型网站都使用的非常频繁,比如阿里巴巴,当用户登入他们系统后,每个子系统都能自动登入,如果大家在登入某宝之后,登入某碑,也需要密码,登入淘宝也需要重新输入密码,这肯定会造成用户体验极差,而且系统的认证逻辑也会很麻烦,这时候单点登入就出现了。

 

2、代码实例


        本文演示两个系统

image.png

image.png

image.png

@Slf4j
@RestController
@RequestMapping("/redis/single")
public class RedisSingleController {
    private static final String NAME = "name";
    private static final String PASSWORD = "password";
    @Resource
    private RedisTemplate redisTemplate;
    @GetMapping("/login_page")
    public ModelAndView loginPage(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 系统1
     * @return
     */
    @GetMapping("/system1")
    public ModelAndView system1(HttpServletRequest request){
        ModelAndView mv  = new ModelAndView();
        if(redisTemplate.hasKey("name")){
            mv.setViewName("systemOnePage");
            return mv;
        }
        request.getSession().setAttribute("goUrl","indexSystem1");
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 系统2
     * @return
     */
    @GetMapping("/system2")
    public ModelAndView system2(HttpServletRequest request){
        ModelAndView mv  = new ModelAndView();
        if(redisTemplate.hasKey("name")){
            mv.setViewName("systemTwoPage");
            return mv;
        }
        request.getSession().setAttribute("goUrl","indexSystem2");
        mv.setViewName("loginPage");
        return mv;
    }
    /**
     * 效验账号密码是否正常
     * @param name
     * @param password
     * @return
     */
    @PostMapping("/detection")
    @ResponseBody
    public Map<String, Object> index( String name, String password, String gotoUrl){
        Map<String, Object> map = new HashMap<>();
        if(!ObjectUtil.equals(name,NAME) || !ObjectUtil.equals(password,PASSWORD)){
            map.put("flag",false);
            map.put("data","账号密码不匹配!");
            return map;
        }
        map.put("flag",true);
        map.put("data","账号密码正确!");
        //redis缓存20s失效
        redisTemplate.opsForValue().set("name",name,10, TimeUnit.SECONDS);
        return map;
    }
    /**
     * 登入成功,系统一进入首页
     * @return
     */
    @GetMapping("/indexSystem1")
    @ResponseBody
    public ModelAndView index(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("systemOnePage");
        return mv;
    }
    /**
     * 登入成功,系统二进入首页
     * @return
     */
    @GetMapping("/indexSystem2")
    @ResponseBody
    public ModelAndView indexSystem2(){
        ModelAndView mv  = new ModelAndView();
        mv.setViewName("systemTwoPage");
        return mv;
    }


1、保证访问系统一登入页面时,进入的是系统一首页,访问系统二登入页面时,进入的是系统二首页。


2、在访问系统一或者系统二时,都需要判断redis里是否存在当前用户,存在则免密登入。


3、逻辑处理,在登入先判断数据库里的账号密码是否正确,若用户在页面登入正确,则返回登入成功,并且存入redis,给他设置过期时间。


4、保证在redis过期时间内其他子系统都能免密登入。

相关实践学习
基于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
相关文章
|
30天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
403 0
|
30天前
|
存储 缓存 NoSQL
深入解析Redis:一种快速、高效的键值存储系统
**Redis** 是一款高性能的键值存储系统,以其内存数据、高效数据结构、持久化机制和丰富的功能在现代应用中占有一席之地。支持字符串、哈希、列表、集合和有序集合等多种数据结构,适用于缓存、计数、分布式锁和消息队列等场景。安装Redis涉及下载、编译和配置`redis.conf`。基本操作包括键值对的设置与获取,以及哈希、列表、集合和有序集合的操作。高级特性涵盖发布/订阅、事务处理和Lua脚本。优化策略包括选择合适数据结构、配置缓存和使用Pipeline。注意安全、监控和备份策略,以确保系统稳定和数据安全。
320 1
|
30天前
|
NoSQL 关系型数据库 MySQL
Redis之秒杀系统
秒杀是一种高并发场景,通常指的是在短时间内(秒级别)有大量用户同时访问某个商品或服务,争相抢购的情景。在这种情况下,系统需要处理大量并发请求,确保公平性、一致性,并防止因并发而导致的问题,例如超卖、恶意请求等。以下是在高并发秒杀场景下需要考虑的一些关键问题和解决方案:
|
30天前
|
NoSQL Linux Redis
Linux系统中安装redis+redis后台启动+常见相关配置
Linux系统中安装redis+redis后台启动+常见相关配置
|
5天前
|
存储 消息中间件 缓存
Redis:内存数据存储与缓存系统的技术探索
**Redis 概述与最佳实践** Redis,全称Remote Dictionary Server,是流行的内存数据结构存储系统,常用于数据库、缓存和消息中介。它支持字符串、哈希、列表等数据结构,并具备持久化、主从复制、集群部署及发布/订阅功能。Redis适用于缓存系统、计数器、消息队列、分布式锁和实时系统等场景。最佳实践包括选择合适的数据结构、优化缓存策略、监控调优、主从复制与集群部署以及确保安全配置。
12 3
|
9天前
|
NoSQL Java 网络安全
Redis在java(Maven)中使用,常用基本命令大全,最全Termius怎么进行端口映射(MAC系统最简单教学)
Redis在java(Maven)中使用,常用基本命令大全,最全Termius怎么进行端口映射(MAC系统最简单教学)
|
19天前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现代Web应用中,性能优化是提升用户体验和响应速度的关键。Redis作为一款开源的内存数据结构存储系统,因其出色的性能、丰富的数据结构和灵活的使用方式,成为了构建高性能缓存系统的首选工具。本文将探讨Redis在缓存系统中的应用,分析其优势,并通过实例展示如何结合Redis构建高效、可靠的缓存系统,以应对高并发、大数据量等挑战。
|
30天前
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现今高负载、高并发的互联网应用中,缓存系统的重要性不言而喻。Redis,作为一款开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。本文将深入探讨Redis的核心特性,以及如何利用Redis构建高性能的缓存系统,并通过实际案例展示Redis在提升系统性能方面的巨大潜力。
|
30天前
|
存储 NoSQL 测试技术
Redis数据存储系统为什么快?
Redis的快速并非偶然,而是深思熟虑的设计理念的结果。通过将数据存储于内存、采用单线程模型、实现非阻塞I/O等独特的技术选择,Redis在高并发和低延迟方面展现了卓越的表现。
40 16
|
30天前
|
缓存 NoSQL Java
【亮剑】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护,如何使用注解来实现 Redis 分布式锁的功能?
【4月更文挑战第30天】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护。基于 Redis 的分布式锁利用 SETNX 或 SET 命令实现,并考虑自动过期、可重入及原子性以确保可靠性。在 Java Spring Boot 中,可通过 `@EnableCaching`、`@Cacheable` 和 `@CacheEvict` 注解轻松实现 Redis 分布式锁功能。