React与Spring REST会话无法持久化问题求助
问题描述
我开发了一个React井字棋组件,调用Spring REST控制器接口实现游戏逻辑,但遇到会话随机丢失的问题——通常仅1-2次请求后会话就失效。尝试过用fetch替代axios、改用常规Controller而非@RestController,问题依旧存在。
后端Spring REST代码
@RestController @CrossOrigin(value = "http://localhost:3000", allowCredentials = "true") public class TTTController { @GetMapping("ttt") public TTTMove makeMove(@RequestParam int x, @RequestParam int y, HttpSession session) { if (session.isNew()) { session.setMaxInactiveInterval(maxTimeOut); session.setAttribute("map", new TTTMap()); } var map = (TTTMap) session.getAttribute("map"); ... } }
前端React代码
const request = axios.create({ withCredentials: true, baseURL: process.env.REACT_APP_API_URL }) ... await request.get("ttt", { params: { x: _x, y: _y } })
排查与解决办法
1. 确认会话超时时间配置
先检查代码里的maxTimeOut值是否设置过小(比如误设为几秒),导致会话快速过期。可以调整为合理值,比如30分钟:
session.setMaxInactiveInterval(1800);
也可以在Spring配置文件里全局设置会话超时,避免单个接口配置遗漏:
server.servlet.session.timeout=30m
2. 修正Cookie的SameSite属性
现代浏览器对跨域Cookie有严格限制,如果Spring会话Cookie的SameSite属性为Strict或Lax,会导致跨域请求无法正确携带Cookie,进而触发新会话。可以修改配置将SameSite设为None(生产环境需配合HTTPS,本地HTTP开发可暂时注释useSecureCookie):
@Configuration public class SessionConfig { @Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); serializer.setSameSite("None"); serializer.setUseSecureCookie(true); // 本地HTTP开发可临时注释 serializer.setCookieName("JSESSIONID"); return serializer; } }
3. 验证请求是否正确携带Cookie
打开浏览器开发者工具的Network面板,检查每次请求的Request Headers是否包含Cookie: JSESSIONID=xxx:
- 确保前端
withCredentials: true配置正确(fetch需设置credentials: 'include'); - 检查跨域预检OPTIONS请求的响应头,必须包含
Access-Control-Allow-Credentials: true,且Access-Control-Allow-Origin为具体域名(不能用*)。
4. 排查Spring会话存储与热重载问题
如果使用默认内存会话存储,Spring Boot热重载会导致内存中的会话丢失,可关闭热重载或改用Redis等持久化会话存储。同时检查是否有过滤器/拦截器(如Spring Security)会重置会话,比如会话固定保护配置不当。
5. 清除重复的JSESSIONID Cookie
浏览器可能存储多个同域名的JSESSIONID Cookie,导致请求携带错误Cookie。可在浏览器Application面板中清除对应域名下的Cookie后重新测试。
内容的提问来源于stack exchange,提问作者Kravuar
相关产品推荐
相关产品推荐

