RedisHttpSession 正在为来自同一浏览器的请求创建不同的 sessionId

RedisHttpSession is creating different sessionIds for requests from the same browser

所以我基本上使用 RedisHttpSession 进行会话管理。我创建了这个登录 API,它在登录成功时将 Staff 对象存储在会话中。 request.getSession().setAttribute("staff", staff); 在其他 API 中,我验证是否有有效的员工登录,如果没有,我将他们重定向到登录页面。 Staff staff = (Staff) request.getSession().getAttribute("staff"); 现在,当我使用 Postman 测试整个场景时,它按预期工作,但是,我将它放在服务器上,request.getSession().getId() 每个请求都不同。

我注意到的另一件事是,当我从 Postman 发送请求时,我看到存储了 cookie,但浏览器上没有 cookie。

为什么每次请求的sessionId都不一样?我该如何解决这个问题?

HttpSession 每次都创建一个新的 SessionId,因为 cookie 没有存储在浏览器中。为了处理这个问题,我创建了一个新的 @Configuration:

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedOrigins("http://localhost:4200", "https://sub.domain.com",
                                "https://sub2.domain.com")
                        .allowedHeaders("*").allowCredentials(true);
            }
        };
    }
}

这将使浏览器保存 cookie,但这本身不足以让一切正常运行。您还必须在前端修改您的请求。将 withCredentials: true 添加到您的请求中,例如:

    const httpOptions = {
      params: new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() })
        .set('fileType', fileType.toString())
        .set('jobDetailsID', jobDetailsID),
      headers: new HttpHeaders().set('ngsw-bypass', 'true'),
      withCredentials: true
    }

或者您可以创建一个 HttpInterceptor 并处理所有请求:

@Injectable()
export class CustomInterceptor implements HttpInterceptor { 

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        request = request.clone({
            withCredentials: true
        });

        return next.handle(request);
    }
}

@NgModule({
  bootstrap: [AppComponent],
  imports: [...],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: CustomInterceptor ,
      multi: true
    }
  ]
})
export class AppModule {}