问题描述
以下的问题,久久不能忘怀。已经思考几天了。我来描述一下问题:我的项目是采用 Language:JavaServer:Tomcat 6 这是一个关于 客户端请求服务器 的问题描述:由于后台查询数据较慢,查询时间大概在 60s 之内。客户端访问 Jsp 页面,然后 服务器 在数据库 进行查询,查询之后,返回一个 Json 字符串。 我做了一个模拟测试,在测试中,暂停该访问线程,我暂停 30s(内) requestInterface2.jsp 代码:Thread.sleep(29000);String result = "{"status":"0","msg":" 查询成功!","cname":"张三"}";out.print(result); 返回:org.apache.catalina.connector.RequestFacade@9bc36d[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":" 查询成功!","cname":"张三"} 暂停该访问线程,我暂停 30s(之后) Thread.sleep(31000);String result = "{"status":"0","msg":" 查询成功!","cname":"张三"}";out.print(result); org.apache.catalina.connector.RequestFacade@15c4ee6org.apache.catalina.connector.RequestFacade@612ef6[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":"查询成功!","cname":"张三"}[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":"查询成功!","cname":"张三"} 亮点来了,注意,输出了两次 reqeust 内存地址,表示请求了两次 request,输出了两次请求的结果. 我碰到的问题:1.为什么会客户端会发起 两次请求? |-- 客户端采用 jqeury ajax 请求此方法只调用了1次,没有调用第二次。function loadJson(){ var varRequestURL = "interface/requestInterface2.jsp"; $.post(varRequestURL,function(data){ alert(data); });}2.为什么请求之后,服务器返回了结果,而客户端没有接收到返回值?后台请求了之后,jqeury ajax 里,一直没有返回值。调用 $.post 方法失败于是使用 jqeury ajax 完整版:$.ajax({ url: varRequestURL, type: 'GET', timeout: 120000, error: function (XMLHttpRequest, textStatus, errorThrown) { alert('请求失败'); alert(XMLHttpRequest); alert(textStatus); alert(errorThrown); },success: function(data){ alert("回调了"); alert(data); } });超时之后,自动提示出 "请求失败"。于是,判断 可能 jquery 有问题,于是不使用 jqeury 库,使用 javascript 的 ajaxfunction createXmlHttp(){ if (window.ActiveXObject) { try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } if (window.XMLHttpRequest) { return new XMLHttpRequest(); } return null;}var varRequest ;function ajaxSubmit(url){ alert('ajaxSubmit'); varRequest = createXmlHttp(); varRequest.open('GET',url,true); varRequest.onreadystatechange=ajaxCallback; varRequest.send(null);}function ajaxCallback(){ if(varRequest.readyState ==1){ }else if(varRequest.readyState==4){ if(varRequest.status=200){ try{ var data = varRequest.responseText; alert(data); }catch(err){ alert(err); } } }}使用结果和使用 jqeury 代码 结果一样。 实在找不出问题所在,求大神解答!!! 另,Tomcat(6) 服务器 在 <Connector connectionTimeout="120000" > 我也已经配置。
解决方案
为什么会客户端会发起 两次请求?这个问题是应该是filter判断的时候出现的,这里并不是两次请求doFilter(req,res,chain)这个方法在过滤时,一去一回,所有出现的两次第二个,服务器肯定是会发送的,但是客户端收不到,说明连接丢了需要使用长连接,并制定连接时间,tomcat是设置下面的这个maxKeepAliveRequests
解决方案二:
光看服务器日志并不能保证客户端是正确调用了。最好还是用工具监视一下IE用fiddle2, firefox用firebug, chrome按f12键开监控看网络部分。这个是分析ajax调用行为的好方法。同时,也可以观察服务器返回的内容。