IE 11中jQuery AJAX POST请求随机出现Content-Length=0的原因排查
解决IE11下Spring MVC AJAX POST随机出现Content-Length=0的问题
我碰到过不少类似IE11下AJAX POST丢数据的情况,结合你的技术栈(Spring 4.3.1、Waffle SSO、jQuery 1.11.3、Tomcat 8.0.49),给你几个针对性的排查和解决方向:
1. 先搞定IE11的文档模式与缓存问题
IE11的兼容模式和缓存机制经常是AJAX问题的罪魁祸首,哪怕你设置了$.ajaxSetup({ cache: false });也可能有遗漏:
- 强制页面使用IE11最新模式:在页面
<head>里添加<meta http-equiv="X-UA-Compatible" content="IE=edge">,避免它自动切换到IE9/10等旧模式(旧模式下AJAX的请求处理逻辑差异很大)。 - 给每个POST请求加唯一时间戳:在请求的
data参数里手动拼接_t: new Date().getTime(),比如:
这种方式能彻底绕开IE11的缓存机制,比全局设置更可靠。$.post('/your/api/url', { // 你的业务参数 username: 'xxx', _t: new Date().getTime() }, function(response) { // 处理响应 });
2. 排查Waffle SSO与IE11的交互冲突
Waffle做Windows身份验证时,IE11在会话过期重验证等场景下,可能会对POST请求做特殊处理导致请求体丢失:
- 检查过滤器顺序:确保Waffle的身份验证过滤器在Spring MVC的
DispatcherServlet之前执行,避免后续过滤器修改或截断请求体。 - 调整Waffle的UA适配:在Waffle的配置里明确识别IE11的User-Agent,避免身份验证流程中误判浏览器类型导致请求异常。
3. 升级jQuery版本或调整AJAX配置
你用的jQuery 1.11.3虽然支持IE11,但存在一些边缘场景的兼容性bug:
- 升级到jQuery 1.x系列的最新稳定版(比如1.12.4),这个版本修复了不少IE11下的AJAX问题,而且不会破坏现有代码的兼容性。
- 放弃全局
$.ajaxSetup,改为在每个AJAX请求中单独设置cache: false,有时候全局配置在IE11中不会被正确应用到所有请求实例。
4. 调整Tomcat的请求处理配置
Tomcat 8.0.49的某些默认配置可能和IE11的POST请求不兼容:
- 修改
maxPostSize参数:在Tomcat的server.xml的Connector节点里添加maxPostSize="-1"(Tomcat 8.0中如果设为0是不限制,但有些场景下IE11的请求头会导致Tomcat误判,设为-1更稳妥)。 - 暂时关闭压缩测试:如果Tomcat开启了
compression="on",IE11在解压缩请求时可能出现异常,先关闭压缩看看问题是否消失。
5. 抓包对比异常与正常请求
如果上面的方法都没解决,建议用Fiddler或者IE11自带的开发者工具抓包,重点对比:
- 异常请求和正常请求的请求头、请求体是否完整,IE11是否发送了OPTIONS预请求或其他特殊请求。
- 查看服务器端日志,确认是Tomcat截断了请求体,还是Spring MVC根本没接收到数据。
测试时记得清空IE11的缓存,确保每次测试都是干净的环境,避免旧缓存干扰结果。
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

