从 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.