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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:19:59