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

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)会重置会话,比如会话固定保护配置不当。

浏览器可能存储多个同域名的JSESSIONID Cookie,导致请求携带错误Cookie。可在浏览器Application面板中清除对应域名下的Cookie后重新测试。

内容的提问来源于stack exchange,提问作者Kravuar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:50:53