如何在Spring Boot中启用粘性会话(Vaadin项目场景)
Vaadin 网站持续刷新问题:启用负载均衡粘性会话解决方案
问题根源
Vaadin 的 UI 实例和 Push 机制依赖会话与服务器实例的绑定——即使你用 Spring Session JDBC 实现了会话数据共享,UI 的状态(比如组件实例、交互上下文)还是存在单个服务器实例的内存里。如果负载均衡没开粘性会话,同一个用户的请求会被随机分发到不同实例,新实例找不到对应的 UI 上下文,就会触发页面重新加载,最终导致持续刷新循环。
不同负载均衡器的粘性会话配置方法
1. Nginx(本地/测试环境常用)
修改 Nginx 配置文件,添加会话绑定规则:
http { upstream vaadin_app { # 配置你的应用实例地址 server localhost:8080; server localhost:8081; # 方式1:基于客户端IP绑定会话 ip_hash; # 方式2:基于Cookie绑定(推荐,比IP_hash更灵活) # sticky cookie vaadin_session expires=1h domain=.yourdomain.com path=/; } server { listen 80; server_name yourdomain.com; location / { proxy_pass http://vaadin_app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
2. Spring Cloud Gateway(微服务场景)
在 Gateway 的 application.yml 配置文件中添加路由的粘性会话规则:
spring: cloud: gateway: routes: - id: vaadin_route uri: lb://vaadin-service # 你的服务注册名 predicates: - Path=/** filters: - name: SessionRoutePredicateFactory args: sessionIdName: JSESSIONID # 对应Spring Session默认会话ID
3. 云服务商负载均衡(以AWS ALB为例)
- 登录云平台控制台,找到你的应用负载均衡
- 进入关联的目标组配置页,开启「粘性会话」选项
- 选择「基于应用程序 Cookie」,指定 cookie 名为
JSESSIONID,或使用平台自带的会话Cookie(如AWS的AWSELB)
注意事项
- 你当前的 Spring Session JDBC 配置和依赖都是正确的,无需修改
- Vaadin 14+ 的 Push 机制(Atmosphere框架)对会话一致性要求更高,必须确保同一用户的 WebSocket 和 HTTP 请求都路由到同一个实例
- 测试粘性会话是否生效:可以在页面上打印当前服务器的端口号,刷新页面查看端口是否保持固定
内容的提问来源于stack exchange,提问作者ladybug
相关产品推荐
相关产品推荐

