zoukankan      html  css  js  c++  java
  • springboot2.0.2+redis+spring-session 解决session共享的问题

    准备工作

    新建两个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
  • 相关阅读:
    windows下安装php5.5的redis扩展
    redis常见命令
    HDU 5869 Different GCD Subarray Query
    WA时查错点
    HDU 3333 Turing Tree
    HDU 5868 Different Circle Permutation
    AcWing 272 最长公共上升子序列 (dp)
    中国计量大学现代科技学院第四届“中竞杯”程序设计校赛 I 题 (双端队列bfs / 优先队列bfs)
    AtCoder ARC 109 D (拆点 + 分类讨论)
    codeforces 1408D. Searchlights (暴力 + 前缀优化)
  • 原文地址:https://www.cnblogs.com/jpfss/p/11016400.html
Copyright © 2011-2022 走看看