我有一个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。
我正在寻找代码修复或提示,以确定是否可能与服务器设置有关。 我几乎可以肯定,这是客户端代码和网络的结合。
不是问题所在
与预测服务有关(Stalled and pending ajax requests by JQuery in Chrome)-尽管有关代理和连接的评论似乎更相关。
广告拦截器扩展程序/插件(Failed to load resource under Chrome)
我尝试失败的地方:
https://www.reddit.com/r/chrome/comments/3ej5ua/err_spdy_protocol_error/
jQuery Ajax requests are getting cancelled without being sent
什么不能回答问题:
在客户端,我尝试清除浏览器数据,刷新套接字和私密浏览/隐身。
有时候,很少会绕过错误的唯一事情是隐身并刷新套接字,并从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 {
}
预期结果是代码应通过成功回调。 而是将请求停留在待处理状态几分钟,然后输入错误回调。
答案 0 :(得分:1)
$.post
在后台调用$.ajax
,只是默认了几个选项。
$.post
默认将contentType
设置为"application/x-www-form-urlencoded; charset=UTF-8"
,这与您的序列化表格数据有效载荷一致。
您对$.ajax
的调用将contentType
设置为false
-这可能导致浏览器向服务器发送飞行前OPTIONS请求,这可能导致行为上的差异您正在体验。
我建议阅读有关jQuery.ajax()
的详细信息以及基于options passed here的各种行为