从 spring 中的给定 ID 开始 session
Start a session from a given id in spring
如何从给定的 ID 而不是生成的 ID 在 spring mvc 应用程序中创建 session?
我想固定 session。
修复将由受信任的 ui 服务启动。此受信任的服务转发所有请求。因此固定不能在浏览器中开始。如果没有此 ui 服务,则不会这样做。
提供 HttpSessionIdResolver bean 不起作用,因为它只会更改 HTTP 响应中的位置。例如Session HTTP 中的ID header 授权后。
有没有不创建影子session管理的解决方案?
Session 是 keycloak 集成的要求uired。猜想在无状态模式下是不可能使用keycloak的。
提前致谢
可以固定会话 spring-session。
@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 也不是一个好主意。可能还有其他架构 solutions/problems.
如何从给定的 ID 而不是生成的 ID 在 spring mvc 应用程序中创建 session?
我想固定 session。 修复将由受信任的 ui 服务启动。此受信任的服务转发所有请求。因此固定不能在浏览器中开始。如果没有此 ui 服务,则不会这样做。
提供 HttpSessionIdResolver bean 不起作用,因为它只会更改 HTTP 响应中的位置。例如Session HTTP 中的ID header 授权后。
有没有不创建影子session管理的解决方案?
Session 是 keycloak 集成的要求uired。猜想在无状态模式下是不可能使用keycloak的。
提前致谢
可以固定会话 spring-session。
@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)
.
即使可能,IMO 也不是一个好主意。可能还有其他架构 solutions/problems.