天天看點

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

繼續閱讀