jQuery Ajax发布请求在Chrome上处于待处理状态

时间:2018-12-21 10:26:42

标签: javascript jquery ajax 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);
    }
});

使用$ .post的单独请求正在处理:

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

服务器端:

@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();
}

如果相关,有以下过滤器。恐怕此刻我不能发布更多它们:

@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 {

}

预期结果是代码应通过成功回调。 而是将请求停留在待处理状态几分钟,然后输入错误回调。

1 个答案:

答案 0 :(得分:1)

$.post在后​​台调用$.ajax,只是默认了几个选项。

$.post默认将contentType设置为"application/x-www-form-urlencoded; charset=UTF-8",这与您的序列化表格数据有效载荷一致。

您对$.ajax的调用将contentType设置为false -这可能导致浏览器向服务器发送飞行前OPTIONS请求,这可能导致行为上的差异您正在体验。

我建议阅读有关jQuery.ajax()的详细信息以及基于options passed here的各种行为