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

Java Servlet间HttpSession无法共享及调试卡Tomcat线程池问题求助

解决HttpSession共享异常及调试卡住问题

一、Session获取失败的核心排查与修复

1. 验证请求的Session Cookie携带情况

第一个Servlet创建Session后,Tomcat会向客户端返回JSESSIONID Cookie,第二个请求必须携带该Cookie才能关联到同一Session:

  • 用浏览器F12开发者工具查看/logdata请求的请求头,确认是否包含Cookie: JSESSIONID=xxx字段
  • 若为跨域请求,前端需设置withCredentials: true,后端CORS配置需开启允许凭证(如Access-Control-Allow-Credentials: true)
  • 用Postman测试时,手动添加Cookie参数,值为第一个请求返回的JSESSIONID

2. 修复代码中的空指针隐患

当前LogData的代码在session为null时直接调用session.getId()会抛出空指针异常,导致控制台无输出。修改代码如下:

HttpSession session = request.getSession(false);
if (session != null) {
    System.out.println("LogData: " + session.getId());
    TextLog textlog = (TextLog) session.getAttribute("textlog");    
    String param = (String) session.getAttribute("param");
} else {
    System.out.println("LogData: 未找到有效Session");
}

添加空判断后,可明确日志输出,快速定位问题。

3. 检查Tomcat Session配置

  • 打开Tomcat的conf/context.xml,确认未配置disableURLRewriting="true"(若前端未传Cookie,URL重写是Session关联的 fallback 机制)
  • 查看web.xml中的Session超时配置,避免Session过早过期:
    <session-config>
        <session-timeout>30</session-timeout> <!-- 默认30分钟,按需调整 -->
    </session-config>
    

二、调试卡住问题的解决

调试卡在ThreadPoolExecutor.runWorker的afterExecute方法,多为环境或线程池问题:

  • 重启Tomcat与Eclipse,清理项目的target/build目录,重新编译部署
  • 检查Eclipse调试配置:移除Tomcat核心类的不必要断点,关闭“挂起所有线程”的冗余设置
  • 切换Tomcat稳定版本(如Tomcat 9/10),排除版本兼容性问题

三、额外排查方向

  • 确认两个Servlet部署在同一Web应用下,而非不同Tomcat实例或Context路径
  • 检查项目中是否存在过滤器(Filter)拦截请求并修改/清除Session信息
  • 清理浏览器缓存与Cookie,避免旧的无效Cookie干扰测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:40:40