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

Spring MVC中Ajax调用无法复用Java Session的问题

解决Spring MVC中Ajax请求无法复用Session的问题

这种情况我之前开发跨域项目时也碰到过!核心问题大概率是Ajax请求没有携带Session对应的JSESSIONID Cookie,导致服务器每次都识别不出当前客户端,只能新建Session。下面是具体的排查和解决步骤:

1. 确保Ajax请求开启凭证携带

不管你用原生XHR、jQuery还是Axios,都必须开启携带Cookie的配置,否则浏览器会自动忽略Session相关的Cookie:

  • 原生XMLHttpRequest写法:
const xhr = new XMLHttpRequest();
xhr.withCredentials = true; // 关键配置,必须开启
xhr.open('POST', '/your/api/endpoint', true);
xhr.send();
  • jQuery Ajax写法:
$.ajax({
  url: '/your/api/endpoint',
  type: 'POST',
  xhrFields: {
    withCredentials: true // 允许携带Cookie
  },
  crossDomain: true // 跨域场景下必须添加
});
  • Axios写法:
axios.post('/your/api/endpoint', {}, {
  withCredentials: true
});

2. 配置Spring MVC的跨域支持(跨域场景必做)

如果你的前端页面和后端API不在同一域名下,光前端开withCredentials还不够,后端必须明确允许携带凭证:

  • 控制器方法级别配置:
@CrossOrigin(origins = "http://your-frontend-domain.com", allowCredentials = "true")
@RequestMapping("/your/api/endpoint")
public ResponseEntity<?> handleRequest() {
  // 业务逻辑
}
  • 全局跨域配置(Java Config方式):
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("http://your-frontend-domain.com") // 不能用*,必须指定具体域名
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowCredentials(true); // 开启凭证支持
  }
}

3. 验证Cookie是否正常携带

打开浏览器开发者工具(F12),切换到Network面板,查看Ajax请求的Request Headers:

  • 如果看不到Cookie字段,或者字段里没有JSESSIONID,说明前端配置没生效,回去检查withCredentials是否正确开启;
  • 如果已经携带了JSESSIONID但服务器还是新建Session,那要排查后端Session配置:比如是否禁用了Cookie存储(server.servlet.session.cookie.enabled=false),或者Session超时时间设置过短,再或者分布式Session(如Redis)配置异常。

按上面的步骤逐一排查,基本就能解决Ajax请求无法复用Session的问题了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:37:35