linapex888 2012-05-29 21:16
浏览 411
已采纳

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

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

我的项目是采用
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 2012-05-29 23:20
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现