在春天从给定的id开始会话



如何在springmvc应用程序中从给定的ID而不是生成的ID创建会话?

我想专注于会议。固定将由受信任的ui服务启动。此受信任的服务转发所有请求。因此,固定不能在浏览器中开始。如果没有这个ui服务,就不打算这么做。

提供HttpSessionIdResolverbean不起作用,因为它只更改HTTP响应中的位置。例如,授权后HTTP标头中的会话ID。

有没有不创建影子会话管理的解决方案?

会话是密钥斗篷集成所必需的。我猜在无状态模式下不可能使用密钥斗篷。

提前感谢

可以用春季会话修复会话。

@Configuration
@EnableSpringHttpSession
public class SessionConfig {
@Bean
public HttpSessionIdResolver httpSessionIdResolver() {
return new HttpSessionIdResolver() {
public List<String> resolveSessionIds(HttpServletRequest request) {
final var sessionId = request.getHeader("X-SessionId");
request.setAttribute(SessionConfig.class.getName() + "SessionIdAttr", sessionId);
return List.of(sessionId);
}
public void setSessionId(HttpServletRequest request, HttpServletResponse response, String sessionId) {}
public void expireSession(HttpServletRequest request, HttpServletResponse response) {}
};
}
@Bean
public SessionRepository<MapSession> sessionRepository() {
return new MapSessionRepository(new HashMap<>()) {
@Override
public MapSession createSession() {
var sessionId =
(String)RequestContextHolder
.currentRequestAttributes()
.getAttribute(SessionConfig.class.getName()+"SessionIdAttr", 0);
final var session = super.createSession();
if (sessionId != null) {
session.setId(sessionId);
}
return session;
}
};
}

#resolveSessionIds()中,您可以读取ID并存储以备以后使用。当没有找到会话并且需要新会话时,调用createSession()。在这里,您可以在MapSession#setId(String)中创建具有以前记忆的ID的会话。

即使可能,IMO也不是一个好主意。可能还有其他体系结构解决方案/问题

最新更新