You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:45:44