【发布时间】:2018-02-15 21:20:47
【问题描述】:
我有 SpringBoot 2.0.0.M7 项目,我正在使用 WebSession 和 Redis (org.springframework.session:spring-session-data-redis:2.0.0.RELEASE)。
我有一个 WebFlux 路由,它应该使用 eBay 会话 ID 重定向到 eBay。每次用户访问该路由时,我都需要从 eBay API 请求不同的会话 ID,并将其包含到重定向 URL 中。稍后,eBay 会将用户重定向回我的应用程序,我需要该会话 ID 来请求令牌。
在测试期间,我发现当浏览器仍然有一个带有现有会话 ID 的 cookie 时,会话属性的值(在我的例子中是 ebay_session_id)不能用新值替换。在我再次请求ebay_session_id 的路线中,我得到的是旧值而不是新值。
保存SessionID的代码如下:
return ebayApiReactiveWrapper
.getSessionId(apiContext)
.flatMap(sessionId ->
request
.session()
.map(webSession -> {
webSession
.getAttributes()
.put("ebay_session_id", sessionId);
return sessionId;
})
)
.flatMap(sessionId -> {
final UriBuilder uriBuilder = uriBuilderFactory.uriString(
ebayApiSettings.getSignInUrl()
);
uriBuilder.queryParam("runame", ebaySettings.getRuName());
uriBuilder.queryParam("SessID", sessionId);
return ServerResponse.temporaryRedirect(redirectUri).build();
});
我尝试在put 方法之后添加webSession.save(),但没有帮助。
我做错了什么?提前谢谢!
更新
关于 Redis 中会话数据的一些新细节。创建会话(空 Redis)时,数据如下所示:
127.0.0.1:6379> hkeys "spring:session:sessions:cbbf8000-6ce8-4238-a427-9aab37d2702b"
1) "lastAccessedTime"
2) "maxInactiveInterval"
3) "creationTime"
4) "sessionAttr:ebay_session_id"
当我第二次访问同一路由时(会话 cookie 仍然存在并且会话数据仍在 Redis 中),数据正在发生变化:
127.0.0.1:6379> hkeys "spring:session:sessions:cbbf8000-6ce8-4238-a427-9aab37d2702b"
1) "sessionAttr:ebay_session_id"
尽管如此,sessionAttr:ebay_session_id 仍然包含来自第一个请求的值。
最糟糕的是,当另一个路由试图获取会话数据时,这种结构会导致NullPointerException。看起来它希望显示其他 3 个字段,但如果不是这样,则会失败。
【问题讨论】:
标签: spring spring-session spring-webflux