jQuery Ajax发布请求在Chrome上暂停

N S*_*arj 19 javascript ajax jquery google-chrome

我有一个jQuery客户端向Spring Controller发出Ajax发布请求.在服务器端,未记录任何错误.在客户端,请求将持续很长时间(分钟),然后可能会因ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_CLOSED而失败.

此问题在Chrome上可重现,但在Firefox上不可重现.已验证的受影响的版本是70.0.3538.77,也可能有其他版本.此外,问题发生在应用程序的特定部署上,而不是其他地方,开发或生产.

客户端在该环境上发送HTTPS 2请求.在开发环境中,它是HTTP 1.1.在服务器上,所有请求都记录为1.1.

没有明显的原因,请求开始通过,但这是一个反复出现的问题,并希望解决它.由于问题开始发生,我无法重现它并检查问题是否与服务器连接太多(超过6个).我使用三台DNS服务器,其中最后一台是Google的8.8.8.8.

我正在寻找代码修复或提示是否这可能与服务器设置有关.我几乎可以肯定它是客户端代码和网络的组合.

问题不在于:

我尝试过的失败了:

什么不回答这个问题:

在客户端,我已经尝试清除浏览器数据,刷新套接字和隐私浏览/隐身.

有时,很少会绕过错误的唯一事情就是隐身和刷新套接字并从chrome:// net-internals /#events中清空缓存

var formData = new FormData();

formData.append( /* ... */ );

//...

$.ajax({
    type: "POST",
    url: "/somepath/update",
    cache: false,
    data: formData,
    contentType: false,
    processData: false,
    success: function(result) {
        //...
    },
    fail: function(result) {
        //....
    },
    error: function( jqXHR, textStatus, errorThrown ){
        alert(textStatus + ":" + errorThrown);
    }
});
Run Code Online (Sandbox Code Playgroud)

使用$ .post的单独请求正在通过:

$.post("someotherpath/update", $("#someForm").serialize())
    .done(function (data) {
        //...
     })
     .fail(function (data) {
         //...
     })
     .always(function () {
         //...
     });
Run Code Online (Sandbox Code Playgroud)

服务器端:

@RequestMapping(value="/somepath/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
public @ResponseBody String update(ModelClass model) {
    JSONObject result = new JSONObject();
    //...
    return result.toString();
}
Run Code Online (Sandbox Code Playgroud)

如果相关,则有以下过滤器.我恐怕此刻不能发布更多内容:

@Configurable
public class Filter1 extends OpenEntityManagerInViewFilter implements Filter{

    public void doFilterInternal(HttpServletRequest httpReq, HttpServletResponse httpResp, FilterChain chain)
        throws ServletException, IOException {
        //...
    }
}


@Configurable
public class Filter2 extends OncePerRequestFilter implements Filter{

    public void doFilterInternal(HttpServletRequest httpReq, HttpServletResponse httpResp, FilterChain chain)
        throws ServletException, IOException {
        //...
    }
}

@Order(/* very small integer */)
public class Filter3 extends OncePerRequestFilter {

}
Run Code Online (Sandbox Code Playgroud)

预期的结果是代码应该通过成功回调.相反,请求会暂停等待几分钟,然后输入错误回调.

小智 2

$.post$.ajax在幕后打电话只是默认了几个选项。

$.post默认值contentType"application/x-www-form-urlencoded; charset=UTF-8"您的序列化表单数据负载一致。

您的调用$.ajax设置contentTypefalse-- 这可能会导致浏览器向服务器发送飞行前 OPTIONS 请求,这可能会导致您遇到的行为差异。

我建议阅读此处传递的选项jQuery.ajax()的详细信息和各种行为