我有一个网站,一旦它从我的服务器发出POST请求(返回一个字符串),客户端上的Web应用程序就会失去与Safari 7上服务器的连接(在OSX 10.9.1 Mavericks上),但是适用于Safari 5(在Mac 10.6.8 Snow Leopard上),Firefox,IE,Chrome。
使用Safari 7的Web Inspector,发出Post操作会返回错误Failed to load resource: The network connection was lost
。
使用网络分析仪,我检查了进入服务器并返回的数据包。实际上,一切都很好。并且,HTTP响应是status = 200(OK)。通过消除过程,我从登录时调用的Java POJO中删除了代码,并最终将错误缩小为一行代码:out.flush()
。我已经总结了它如何在下面的Java Servlet代码片段中使用。评论flush()
启用的Safari 7运行正常。
我不确定为什么flush()会导致Safari出现问题。这似乎是一种非常通用的Java设计模式(即flush()
之前的close()
)。据我所知,close()
不能保证包含flush()
命令。但是,我确实注意到在没有包含flush()
的情况下数据包大小略有减少,如果收到的字节数与预期的字节数不同,Safari可能会关闭连接。以下链接表明了这一点......
当我注释掉flush()
代码时,其他浏览器也可以正常工作。
我对Java专家的问题:
在没有首先发布close()
健壮的情况下发布flush()
的设计模式是什么?我会遇到问题吗?为什么或为什么不呢?
任何人都有更好的理论为什么Safari不喜欢flush()
?
----------- Java Servlet ---------
package com.mycompany.servlet;
...
public class UserLogin extends HttpServlet {
protected void doPost (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// get input parameters
userEmail=req.getParameter("uEmail");
userPwd=req.getParameter("uPwd");
// query database to retrieve variable1, variable2, etc.
...
// write output response
PrintWriter out = res.getWriter();
out.println(variable1);
out.println(variable2);
out.println(variable3);
...
out.flush(); // this line causes Safari 7.0 on Mac OSX 10.9.1 to lose connection
out.close();
}
}