为什么IE 11浏览器随机具有jQuery AJAX POST请求的内容长度= 0?

我正在开发基于Spring MVC的web应用程序。

以下是我的环境详细信息:- 、 、 、 (对于 SSO) 和 。Java 1.8.0_162 (64 bit)Spring 4.3.1Apache Tomcat 8.0.49Waffle-1.8.3jquery-1.11.3Google Charts API

已将以下JavaScript代码放在其中一个常见的JS文件中:-$.ajaxSetup({ cache: false });

对服务器发出的jQuery AJAX请求在MozillaChrome浏览器中完美无缺。但是当涉及到IE 11浏览器时,jQuery AJAX请求仅在首次加载窗口时才正常工作。然后随机失败,一旦失败,后续请求也会失败。POSTPOST

以下是IE 11浏览器的“网络”选项卡的快照:-

  1. 成功的 ajax 请求:POSTenter image description here

  2. 失败的 ajax 请求:POSTenter image description here

这两个请求在其各自的请求正文中都有 JSON 对象。但是,对于成功的请求,属性值为 416(字符串化 JSON 对象的总字符数),对于失败的请求,属性值为 0。对于随机失败的请求和后续请求,始终为 0,但计算的 JSON 对象始终存在于请求正文中。在每个请求中,JSON 对象都是动态构建的。Content-LengthPOSTContent-Length

更新-1 (2018年3月26日)以下是文件中定义的AD身份验证配置:-Waffleweb.xml

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>
    <init-param>
        <param-name>principalFormat</param-name>
        <param-value>fqn</param-value>
    </init-param>
    <init-param>
        <param-name>roleFormat</param-name>
        <param-value>both</param-value>
    </init-param>
    <init-param>
        <param-name>allowGuestLogin</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>securityFilterProviders</param-name>
        <param-value>
            waffle.servlet.spi.NegotiateSecurityFilterProvider
        </param-value>
    </init-param>
    <init-param>
        <param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
        <param-value>
            Negotiate
            NTLM
        </param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/welcome.do</url-pattern>
</filter-mapping>

将 1 个 URL(即 /welcome.do(加载 web 应用的初始 URL)配置为调用 SSO 身份验证。

以下是触发AJAX请求的JavaScript代码:-

function getData() {
    let dashboardFilterParams=new DashboardFilterParams(<passing the arguments to this constructor>);
    //alert(JSON.stringify(dashboardFilterParams));
    //console.dir(dashboardFilterParams);
    $.ajax({
            url: str_THIS_WA_URL+"/xyz/abcdXYZ.do?httpReqType=ajaxReq",
            data: JSON.stringify(dashboardFilterParams),
            dataType: "json",
            contentType: "application/json",
            mimeType: "application/json",
            type: "POST",
            success:function(responseData){
                        if(responseData && "success"===responseData.reqResult) {
                            //populating tables & drawing charts using Google Charts JS API if successfully fetched the data
                        } else {
                            //showing error message
                        }
                    },
            error:function(data,status,er) {
                        showTheMessage("danger","Error getting data");
                        console.log("error: "+JSON.stringify(data)+"\n status: "+status+"\n er:"+er);
                    }
     });
}

IE 11 版本详细信息:

IE 11 version details

此外,我正在使用Google Charts API在页面上呈现图表。为此,请求被触发到Google Charts API服务器。这在IE浏览器中是否受到影响?

使其在IE 11浏览器中工作的解决方案是什么?

在评论部分回答Federico klez Culloca的问题:

  1. 请求(客户端)端没有错误。但是来自服务器的响应说.和响应标头 。The request sent by the client was syntactically incorrectResponse HTTP/1.1 400 Bad Request

  2. 请求正文内容绝对没有差异。

  3. 指向与 web 应用相同的域,即 AJAX 请求位于当前域中。str_THIS_WA_URL variable

将时间戳(根据Shawn在下面的评论部分中的建议)添加到URL中并不能解决问题。


答案 1

IE这样做是一种优化,因为它期望服务器使用HTTP / 401凭据质询进行回复,并且传输正文两次将是一种浪费。

在你的情况下,由于使用NTLM进行保护,IE现在假设并且下面的所有内容都是安全保护空间的一部分,因此将无体POST优化应用于所有内容。/welcome.do/

解决方法是移动到 并确保没有不安全的资源位于 下。/welcome.do/secured/welcome.do/secured

此处有更多详细信息:质询-响应身份验证和零长度帖子


答案 2

推荐