Cloud++:SpringCloudGatewayWebSession笔记刚接触到 gateway 的时候难免会遇到⼀些坎坷,特此写下笔记。
WebSession:
以往⽤ zuul 作⽹关的时候,直接使⽤ @EnableRedisHttpSession 在配置⾥⾯就可以通过 redis 共享 session 信息
spring 同时提供了 EnableRedisWebSession 来对 WebFlux 的⽀持
session 的jar包引⼊POM:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
添加 redis 配置:
spring:
redis:
host: 192.168.1.101
port: 6379
timeout: 20000
pool:
# 连接池最⼤连接数(使⽤负值表⽰没有限制)
max-active: 8
# 连接池中的最⼩空闲连接
min-idle: 0
# 连接池中的最⼤空闲连接
max-idle: 8
# 连接池最⼤阻塞等待时间(使⽤负值表⽰没有限制)
max-wait: 5000
password:
然后在 filter ⾥⾯配置:
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = Request();
String url = URI().getPath();
Session().flatMap(webSession -> {
LOGGER.info("websession: {}", Id());
return chain.filter(exchange);
}).then(Mono.fromRunnable(() -> {
LOGGER.info("this is a post filter");
}));
}
请求经过filter的时候,会将 Attributes().Id(), “sign”);存⼊redis
可以看到刚才保存进去的数据:
但是这⾥有⼀个问题,直接这样存储的数据,由于 Gateway 使⽤ Netty 作为容器,转发的时候 sessionId 已经发⽣了变化,所以下游服务并不能获取到正确的 sessionId
⽹关中的 sessionId:
下游的 sessionId:
session怎么记忆使⽤ Gateway 只能⽤ token 的⽅案,不能⽤浏览器⾃⾝的 session 作为客户端凭证的⽅案例如在 heade r⾥⾯加⼊ token 的头存⼊到 redis 中。
之后的请求都携带 token 信息作为凭证,如何运⽤ token 这⾥就不叙述了。
- - -
另外在实际使⽤中,发现低版本的lettuce存在严重bug,会有redis⾥⾯存在数据但读出来为null的情况
这种情况在lettuce的github上也有看到issue
在5.1.5.RELEASE已经修复,在实际使⽤的时候需要注意尽量引⽤⾼版本的。
使⽤Springboot 2.1.5.RELEASE版⾃动依赖的就是5.1.6.RELEASE版本的lettuce
⽬前webflux相关的组件感觉还是没有完全成熟,使⽤的时候可能还是会遇到⽐较多的坑。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论