Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 456|回复: 0

springboot2.0.2+redis+spring-session 解决session共享的问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-30 13:47:46 | 显示全部楼层 |阅读模式

    准备工作

    新建两个springboot2.0.2版本的服务,配置文件添加:

    #在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
    

    配置文件需要添加以上两项配置,不然会报以下错误:

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    

    集成redis

    添加Maven依赖:

    <!--spring boot 与redis应用基本环境配置 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    <!--jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    必须添加第三个依赖,不然会报以下错误:

    Caused by: java.lang.NoClassDefFoundError: redis/clients/jedis/Tuple
    

    添加redis配置信息:

    # REDIS (RedisProperties)
    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=localhost
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.jedis.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.jedis.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.jedis.pool.max-idle=8
    # 连接池中的最小空闲连接
    spring.redis.jedis.pool.min-idle=0
    # 连接超时时间(毫秒)
    spring.redis.timeout=500
    

    **注:关于springboot各个版本的redis集成,参考springboot中各个版本的redis配置问题

    新建sessionConfig类

    //这个类用配置redis服务器的连接
    //maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
    @EnableRedisHttpSession(maxInactiveIntervalInSeconds= 1800)
    public class SessionConfig {
    
    <span class="hljs-comment"><span class="hljs-comment">//冒号后的值为没有配置文件时,制动装载的默认值</span></span>
    <span class="hljs-meta"><span class="hljs-meta">@Value</span></span>(<span class="hljs-string"><span class="hljs-string">"${spring.redis.host:localhost}"</span></span>)
    String HostName;
    <span class="hljs-meta"><span class="hljs-meta">@Value</span></span>(<span class="hljs-string"><span class="hljs-string">"${spring.redis.port:6379}"</span></span>)
    <span class="hljs-keyword"><span class="hljs-keyword">int</span></span> Port;
    <span class="hljs-meta"><span class="hljs-meta">@Bean</span></span>
    <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span><span class="hljs-function"> JedisConnectionFactory </span><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">connectionFactory</span></span></span><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()</span></span></span><span class="hljs-function"> </span></span>{
        JedisConnectionFactory connection = <span class="hljs-keyword"><span class="hljs-keyword">new</span></span> JedisConnectionFactory();
        connection.setPort(Port);
        connection.setHostName(HostName);
        <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> connection;
    }
    

    }

    test主类中添加测试接口(端口号:8763):

    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    public class ServerTestApplication {
    

    public static void main(String[] args) {
    SpringApplication.run(ServerTestApplication.class, args);
    }

    @RequestMapping(value="/",method = RequestMethod.GET)
    public String setSession(HttpServletRequest request){
    Map<String,Object> map = new HashMap();
    map.put("name","超级管理员");
    map.put("account","admin");
    request.getSession().setAttribute("userSession",map);
    String sessionId = request.getSession().getId();
    return sessionId;
    }
    }

    返回结果:

    4c0fe3e3-87cc-4991-acae-8bca2645705a
    

    test1主类中添加测试(端口号:8764)

    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    public class ServerTest1Application {
    

    public static void main(String[] args) {
    SpringApplication.run(ServerTest1Application.class, args);
    }

    @RequestMapping(value="/",method = RequestMethod.GET)
    public Map<String,Object> getSession(HttpServletRequest request){
    String sessionId = request.getSession().getId();
    Object obj = request.getSession().getAttribute("userSession");
    Map<String,Object> map = new HashMap();
    map.put("sessionId",sessionId);
    map.put("user",obj);
    return map;
    }
    }

    返回结果:

    <Map>
      <sessionId>4c0fe3e3-87cc-4991-acae-8bca2645705a</sessionId>
      <user>
        <name>超级管理员</name>
        <account>admin</account>
      </user>
    </Map>
    

    从以上结果可以看出,访问8763端口服务的sessionId信息和访问8764端口服务的sessionId信息一致

    原文地址:https://www.jianshu.com/p/f0a069d2a85b
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-4 08:45 , Processed in 0.056029 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表