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
相关产品推荐
相关产品推荐

