如何在Java Servlet中控制Session创建并保留首次会话?
解决Servlet每次请求创建新Session的问题
问题出在前端的fetch请求没有携带Session对应的Cookie,导致服务器无法识别已有会话,每次都新建Session。
直接解决方案
在fetch请求配置中添加credentials: 'include',让请求自动携带当前域名下的Cookie(包括标识Session的JSESSIONID):
修改后的JS代码:
const sendRequest = async (data) => { await fetch('http://localhost:8080/', { method: 'POST', body: JSON.stringify(data), headers: { 'Detail': 'requisites', 'Content-type': 'application/json; charset=UTF-8', }, credentials: 'include' // 关键配置:携带Cookie }) .catch((err) => console.log(err.message)); }
跨域场景补充配置
如果前端和后端是跨域部署(比如前端在localhost:3000,后端在localhost:8080),还需要在Servlet端配置允许跨域携带凭证:
在LoginServlet和MainServlet的doPost方法开头添加以下代码(或用过滤器统一处理所有请求):
// 替换为你的前端实际域名,不能用* resp.setHeader("Access-Control-Allow-Origin", "http://localhost:3000"); resp.setHeader("Access-Control-Allow-Credentials", "true");
问题原因说明
Servlet的Session依赖JSESSIONID Cookie来跟踪会话:首次请求时服务器创建Session并返回JSESSIONID Cookie,后续请求需要携带这个Cookie,服务器才能找到对应的Session。而fetch API默认不携带Cookie,所以每次请求服务器都认为是新客户端,创建新Session。你的后端Session获取逻辑是正确的,问题完全在前端请求配置。
内容的提问来源于stack exchange,提问作者XterS
相关产品推荐
相关产品推荐

