feng6850170
linapex888
2012-05-29 21:16

【辨别】真心求辨别,是客户端问题,还是服务端问题?

已采纳

以下的问题,久久不能忘怀。
已经思考几天了。
我来描述一下问题:

我的项目是采用
Language:Java
Server: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@15c4ee6
org.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 的 ajax



function 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" > 我也已经配置。

 

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • ll89308839 ll89308839 9年前

    为什么会客户端会发起 两次请求?
    这个问题是应该是filter判断的时候出现的,这里并不是两次请求

    doFilter(req,res,chain)
    这个方法在过滤时,一去一回,所有出现的两次

    第二个,服务器肯定是会发送的,但是客户端收不到,说明连接丢了
    需要使用长连接,并制定连接时间,tomcat是设置下面的这个
    maxKeepAliveRequests

    点赞 评论 复制链接分享
  • iteye_7589 iteye_7589 9年前

    光看服务器日志并不能保证客户端是正确调用了。
    最好还是用工具监视一下
    IE用fiddle2, firefox用firebug, chrome按f12键开监控看网络部分。

    这个是分析ajax调用行为的好方法。

    同时,也可以观察服务器返回的内容。

    点赞 评论 复制链接分享

相关推荐