SpringBoot+Session+redis实现分布式登录

SpringBoot+Session+Redis实现分布式登录功能实现

文章目录

目录

文章目录

前言

一、引库

二、修改配置文件

三、使用

四、解决乱码问题

1.引库

2.配置redis序列化

3.配置Session-Redis序列化



前言

这里简单介绍一下,如果你想多台机器部署你的项目的话,在登录方面如果你用到了session的话,因为session中的登录信息是存放到内存中的,多机部署的话,假设你在A机器登录了,但是获取信息的时候查到了B机器,可是B机器根本就没有你的登录信息就会导致抛给用户,让用户重新登陆,可是如果有100台机器呢,意味着要登陆100遍吗,不合适,所以就需要把用户的登录信息存储下来,有什么方式吗?

  1. 使用Mysql数据库
  2. 使用Redis缓存

这里就考虑一个问题了,如果说登陆的用户信息太多的话,Mysql数据库会不会影响查询速度,也就是Qps,所以这个时候redis就可以完美的避开这种影响


一、引库

这里我用的springBoot版本是2.6.4,所以下面的两个库我选择了相同版本,如果你的项目用到了别的SpringBoot版本的话更换版本就可以

XML 复制代码
        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.6.4</version>
        </dependency>

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

二、修改配置文件

XML 复制代码
  # redis配置
spring:
  redis:
    port: 6379
    host: localhost
    database: 0
  # session 失效时间(分钟)
  session:
    timeout: 86400
    store-type: redis

其实这里主要就是store-type设置成为redis就好

三、使用

这样的话你登录之后用户信息就会存储到redis中了

但是此时就出来了一个问题,那就是乱码了,接下来解决它

四、解决乱码问题

1.引库

XML 复制代码
          <!--Jackson JSON-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

2.配置redis序列化

java 复制代码
package com.yupi.xinggui.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        // 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        template.afterPropertiesSet();
        return template;
    }
}

3.配置Session-Redis序列化

java 复制代码
package com.yupi.xinggui.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public class SessionConfig {

    /**
     * 配置Spring Session的默认Redis序列化器。
     * 
     * 本方法旨在提供一个自定义的Redis序列化器,用于在Spring Session中序列化和反序列化会话数据。
     * 选择GenericJackson2JsonRedisSerializer是因为它支持将Java对象序列化为JSON格式,
     * 这样可以在Redis中存储更复杂的会话属性,而不仅仅是简单的字符串或数字。
     * 
     * @return GenericJackson2JsonRedisSerializer 实例,用于序列化和反序列化会话数据。
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }

}

现在就可以看到用户信息了

今日时间2024年7月20日,希望这篇博客可以帮助到你,愿你天天开心

相关推荐
宠友信息33 分钟前
IM系统开发技术路线分析,即时通讯源码助力快速搭建聊天应用
java·spring boot·redis·websocket·mysql·uni-app·vue
肠畔码农1 小时前
Redis 主从复制内核深潜:从物理模型到全量增量同步的本质
网络·redis·php
QQ_21696290962 小时前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
凤山老林3 小时前
高可用服务容错架构:Spring Boot 集成 Resilience4j 实战指南
spring boot·后端·架构·resilience4j
SQL-First布道者4 小时前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc
小的~~4 小时前
面试被问分布式锁,我差点语塞…直到搞懂了Redis、ZooKeeper和etcd的“三国杀”
redis·分布式·面试
小蒜学长4 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
凤山老林4 小时前
轻量级规则引擎落地:Spring Boot 集成 LiteFlow 实现动态业务编排与热更新
java·spring boot·后端·规则引擎·liteflow
2602_959960925 小时前
Java大厂面试实录:Spring Boot、Redis、Kafka、Elasticsearch、分布式事务与云原生高并发系统
java·jvm·spring boot·redis·面试题
武科大许志伟5 小时前
从并行进化到分布式进化计算读 A Survey on Distributed Evolutionary Computation
人工智能·分布式·演化计算