轮询模式下session丢失需三步验证:一是检查cookie是否被浏览器静默丢弃,确认set-cookie含samesite=none; secure且cors头正确;二是验证后端是否识别session id,查请求cookie字段及日志;三是确认轮询是否导致请求跳转不同节点,通过x-node响应头比对,若变化则需启用ip_hash或共享session存储。

轮询模式下 Session 丢失不是轮询本身的问题,而是请求没带对的上下文、或后端没认出这个上下文。排查要从“Cookie 是否送达”“后端是否能关联”“路由是否稳定”三个环节入手,不靠猜,靠验证。
检查 Cookie 是否被浏览器静默丢弃
现代浏览器(Chrome 80+、Edge、Firefox)默认阻止跨域 Cookie,即使前端发了 credentials,若响应 Cookie 缺少 SameSite=None; Secure,它根本不会发给后端。
- 用浏览器开发者工具 → Application → Cookies,看登录后响应 Set-Cookie 头里有没有
SameSite=None; Secure - 如果没有,Nginx 需补配置:
proxy_cookie_path / "/; HttpOnly; Secure; SameSite=None";
(注意:必须走 HTTPS,HTTP 下 Secure 会失效) - 同时确认 Nginx 返回了正确的 CORS 头:
add_header 'Access-Control-Allow-Origin' 'https://your-frontend.com';add_header 'Access-Control-Allow-Credentials' 'true';
不能写*,否则 Cookie 不生效
确认 Session ID 是否被后端正确识别
Cookie 到了,但后端可能没读到、读错路径、或 Session 已过期。
- 抓包或查后端日志,看每次请求头中
Cookie:字段是否包含JSESSIONID=xxx(或其他 Session ID) - 检查 Nginx 是否改写了 Cookie 路径:
若后端应用部署在子路径(如/app),而 Nginx proxy_pass 指向根路径,需加:proxy_cookie_path /app /; - 确认后端 Session 超时时间是否过短;检查 Tomcat 的
session-timeout或 Spring Boot 的server.servlet.session.timeout
验证轮询是否真导致请求跳转不同节点
轮询本身不保证粘性,用户两次请求很可能落到不同 Tomcat,而各节点 Session 不共享,自然登出。
- 在每台后端加唯一标识响应头,比如:
Tomcat-A: response.setHeader("X-Node", "node-a");Tomcat-B: response.setHeader("X-Node", "node-b"); - 用 curl 或浏览器连续发两次请求,看
X-Node值是否变化 - 如果变了,说明轮询正在分发——这不是故障,是轮询的正常行为;此时必须引入会话保持或共享机制,不能只靠轮询
补充检查关键代理头是否透传
有些后端依赖原始 IP 或 Host 做权限/路由判断,头缺失会导致 Session 初始化失败或重定向异常。
- 确保 Nginx 中有这些基础设置:
proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme; - 禁用自动重定向改写:
proxy_redirect off;(避免 Location 头被错误覆盖,导致跳转丢失 Cookie)











