Spring WebFlux登录会话管理疑问:为何未生成Session ID
Spring WebFlux登录接口未返回Session ID的问题解决
问题出在你当前的登录逻辑里没有主动触发WebSession的创建,而WebSessionServerSecurityContextRepository的save方法仅会在已有会话存在时才保存安全上下文,不会主动创建新会话,所以登录后不会返回Set-Cookie头。
解决步骤:
在登录成功后,先调用exchange.getSession()方法获取或创建WebSession(该方法会在无会话时自动创建新会话并生成Session ID),再执行安全上下文的保存操作。
修改后的登录接口代码:
@PostMapping("login") fun login(@RequestBody dto: LoginDto, exchange: ServerWebExchange): Mono<Unit> { return reactiveAuthenticationManager.authenticate( UsernamePasswordAuthenticationToken(dto.email, dto.password) ).flatMap { authentication -> // 获取或创建WebSession,触发Session ID生成与Set-Cookie响应头 exchange.getSession() .flatMap { _ -> serverSecurityContextRepository.save(exchange, SecurityContextImpl(authentication)) .contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication)) } }.then() }
关键说明:
exchange.getSession()是触发会话创建的核心:当请求中没有携带有效会话Cookie时,该方法会创建新的WebSession,此时框架会自动将Session ID写入响应的Set-Cookie头。- 原代码中直接调用
serverSecurityContextRepository.save()时,由于没有现有会话,该方法不会执行任何保存操作,自然不会生成Session ID。
内容的提问来源于stack exchange,提问作者Oreste Viron
相关产品推荐
相关产品推荐

