为什么IE 11浏览器随机地为jQuery AJAX POST请求提供Content-Length = 0?

时间:2018-03-21 10:32:10

标签: java jquery ajax internet-explorer-11 waffle

我正在开发基于Spring MVC的webapp。

以下是我的环境详情: - 针对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 POST请求在 Mozilla & Chrome 浏览器。 但是当谈到 IE 11 浏览器时,jQuery AJAX POST请求只有在第一次加载窗口时才能正常工作。 然后随机失败&一旦失败,后续请求也会失败。

以下是 IE 11 浏览器的网络标签的快照: -

  1. 成功 ajax POST请求: enter image description here

  2. 失败 ajax POST请求: enter image description here

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

    UPDATE-1(26March2018)以下是Waffle文件中定义的web.xml AD身份验证配置: -

    <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 网址,即/welcome.do(加载网络应用的初始网址)配置为调用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 incorrect。和回复标题Response HTTP/1.1 400 Bad Request

    2. 请求正文内容绝对没有区别。

    3. str_THIS_WA_URL variable指向与webapp相同的域,即AJAX请求在当前域内。

    4. 在URL中添加时间戳(在 shawn 的建议在下面的评论部分中)并没有解决问题。

1 个答案:

答案 0 :(得分:1)

IE之所以将其作为一种优化,是因为它希望服务器以HTTP / 401凭据质询进行响应,并且两次传输正文都是浪费。

在您的情况下,由于/welcome.do受NTLM保护,因此IE现在假定/ 及其以下所有内容是受保护的保护空间的一部分,因此应用了无主体的POST优化一切。

一种解决方法是将/welcome.do移至/secured/welcome.do并确保/secured下没有不安全的资源。

此处有更多详细信息:Challenge-Response Authentication and Zero-Length Posts