我想将我的Spring Webflux项目从Spring Boot2.0.1升级到Spring Boot2.0.3。在我的项目中,我的会话是由Spring会话数据Redis支持的。在升级Spring Boot版本时,我注意到Spring Boot 2.0.2+中的websession无效问题。
在Spring Boot 2.0.1中,我通过以下方式使会话无效:
webSession.invalidate().subscribe();
这导致我的当前会话被破坏,生成了一个新的会话ID、创建时间等。
private static final class SessionMapper implements Function<Map<String, Object>, MapSession> {
private final String id;
private SessionMapper(String id) {
this.id = id;
}
public MapSession apply(Map<String, Object> map) {
MapSession session = new MapSession(this.id);
session.setCreationTime(Instant.ofEpochMilli((Long)map.get("creationTime")));
session.setLastAccessedTime(Instant.ofEpochMilli((Long)map.get("lastAccessedTime")));
session.setMaxInactiveInterval(Duration.ofSeconds((long)(Integer)map.get("maxInactiveInterval")));
map.forEach((name, value) -> {
if (name.startsWith("sessionAttr:")) {
session.setAttribute(name.substring("sessionAttr:".length()), value);
}
});
return session;
}
}
session.setCreationTime(Instant.ofEpochMilli((Long)map.get("creationTime")));
这是一个bug还是我错过了Spring Boot2.0.2+中关于Spring会话的一些新内容?
更新
为了提供更多信息,我创建了一个再现问题的示例项目:https://github.com/adsanche/test-redis-session
@Controller
public class HelloController {
@GetMapping(value = "/hello")
public String hello(final WebSession webSession) {
webSession.getAttributes().put("test", "TEST");
return "index";
}
@GetMapping(value = "/invalidate")
public String invalidate(final WebSession webSession) {
webSession.invalidate().subscribe();
return UrlBasedViewResolver.REDIRECT_URL_PREFIX + "/hello";
}
}
>
转到第一个endpoint:http://localhost:8080/hello
Redis中的会话状态:
我们注意到以7546FF开头的会话ID,以及包含“test”属性加上默认会话信息(创建/上次访问时间等)的会话数据。
当前会话无效,并对“/hello”执行重定向,其中在新的web会话中添加了test属性。
我们注意到新的会话ID以ba7de开头,新的会话数据仍然包含测试属性和默认会话信息。
>
转到第一个endpoint:http://localhost:8080/hello
Redis中的会话状态:
我们注意到以12D61开头的会话ID,以及包含“test”属性加上默认会话信息(创建/上次访问时间等)的会话数据。
这是Spring Session的SpringSessionWebSessionStore
中的一个bug,更具体地说,是其内部的WebSession
实现中的一个bug。问题是,在websession#invalidate
上,会话仅从基础会话存储中清除,但未标记为无效,因此后续的请求处理最终仍使用相同的会话ID。
我已经在Spring会议上开放了gh-1114来解决这个问题。
我相信您以前没有经历过这种情况,例如在Spring Session2.0.2.release
及其以下版本中,这是由于SpringSessionWebSessionStore
中的另一个bug在2.0.3.release
中解决了-请参阅GH-1039。此问题是关于无法更新LastAccessedTime
的,一旦我们修复了您描述的方案,您就开始失败了,原因是无效(和已删除)会话id的会话仅使用LastAccessedTime
属性再次保存。
我在jupyter中,选择kernel scala 2.11,当我放置返回数据时运行平稳: 然后,当我执行时,它返回
我正在使用NetBeans IDE 8.2和Maven 3.5.0。当NetBeans的一个操作试图下载插件时,它会失败: 下载:https://repo.maven.apache.org/maven2/org/codehaus/mojo/xml-maven-plugin/1.0/xml-maven-plugin-1.0.pom 我在以下位置定义了代理: NetBeans:工具->选项->常规 C
问题内容: 我刚刚使用jdk7创建了一个jar文件。我尝试运行它,但一直出现错误。原来,它指向的是jre6,而不是jdk7中的jre。因此,我使用以下命令对其进行了更改 ftype jarfile =“ C:\ jre \ bin \ javaw.exe的路径” -jar“%1”%* 之后,我试图再次双击我的jar文件,但是它弹出了一个窗口,要求我选择一个打开它的程序。当我选择与上述相同的java
1.我从“git克隆https://github.com/corda/samples"”下载的 2.我从Intellij As页面打开项目(https://docs.corda.net/tutorial-cordapp.html#downloading-示例cordapp)显示 3.我选择了“运行示例CordApp-静态编程语言”,并开始调试 4.我从智能控制台得到一些例外 我访问“网址”,但它不
问题内容: 我正在使用以下查询,以尝试从每个项目中检索最大数量的幻灯片的总数(总和),但是我收到以下错误(#1111-组功能的无效使用)。这是查询: 如果删除SUM(),则它可以工作,但是,对于所有项目/幻灯片,我都无法获得准确的总数。 预先感谢您的所有答复。 问题答案: