Javascript jQuery Ajax post请求在Chrome上被挂起
我有一个jQuery客户端向Spring控制器发出Ajax post请求。 在服务器端,没有记录任何错误。 在客户端,请求被挂起很长一段时间(分钟),然后可能会在ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_关闭的情况下失败 这个问题在Chrome上是可以重现的,但在Firefox上不是。已验证的受影响版本为70.0.3538.77,可能还有其他版本。 此外,问题发生在应用程序的特定部署上,而不是在开发或生产的其他地方 客户端在该环境上发送HTTPS 2请求。在开发环境中,它是HTTP1.1。在服务器上,所有请求都记录为1.1 没有明显的原因,请求开始通过,但这是一个反复出现的问题,我们希望解决它。 由于问题开始出现,我无法重现它并检查问题是否是到服务器的连接太多(超过6个)。 我使用三台DNS服务器,最后一台是谷歌的8.8.8.8 我正在寻找一个代码修复或提示,这是否可能与服务器安装有关。 我几乎可以肯定,它是客户端代码和网络的结合 问题不在于:Javascript jQuery Ajax post请求在Chrome上被挂起,javascript,jquery,ajax,google-chrome,Javascript,Jquery,Ajax,Google Chrome,我有一个jQuery客户端向Spring控制器发出Ajax post请求。 在服务器端,没有记录任何错误。 在客户端,请求被挂起很长一段时间(分钟),然后可能会在ERR_SPDY_PROTOCOL_ERROR或ERR_CONNECTION_关闭的情况下失败 这个问题在Chrome上是可以重现的,但在Firefox上不是。已验证的受影响版本为70.0.3538.77,可能还有其他版本。 此外,问题发生在应用程序的特定部署上,而不是在开发或生产的其他地方 客户端在该环境上发送HTTPS 2请求。在开
- 防病毒()
- 预测服务相关()-关于代理和连接的注释似乎更相关
- Ad阻止程序扩展/插件()
$.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 {
}
预期结果是代码应该通过成功回调。
相反,请求被挂起几分钟,然后进入错误回调。
$.post
正在调用$.ajax
,只是默认了几个选项
$.post
默认值contentType
到“application/x-www-form-urlencoded;charset=UTF-8”
,这将与序列化表单数据负载一致
您对$.ajax
的调用将contentType
设置为false
——这可能会导致浏览器向服务器发送飞行前选项请求,这可能会导致您体验到的行为差异
我建议您阅读有关
jQuery.ajax()
的详细信息,以及基于的各种行为,您的jQuery版本是…?:您是否尝试过使用postman或curl发送基本请求以确认服务器是否对相同类型的请求做出了正常响应?谢谢您的评论@CodyG。版本是1.7.2。我还没有试过邮递员,但我想试一下Firefox就足够了。需要考虑的是:我遇到了各种各样的问题,因为我在中打开了一个标志chrome://flags/. flag实验性web平台功能
打开一些web服务器无法处理的新标题。测试时也尝试重置这些标志。请看一看chrome开发者工具(按Win上的F12键),然后查看网络选项卡,并尝试运行代码。它应该显示您正在发送的数据和可能出现的任何错误,并让我们知道结果是什么。还可以尝试比较Chrome/Firefox/Chrome incognition上的输出,以检查协议。如果页面url是“https”,那么您尝试访问的后端代码也应该受到保护。我也遇到过类似的问题。谢谢你的回答。我需要将contenttype设置为false,因为我正在发送一些文件。但你是对的。它可能是一个跨域请求(由于DNS重定向)。不幸的是,我现在没有办法知道。我会支持你的答案,因为它很有用,但我不能接受。如果你上传文件,最好在表单数据回发之外处理。
@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 {
}