博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过web代理进行跨域访问,http请求返回超时的问题定位
阅读量:5088 次
发布时间:2019-06-13

本文共 7227 字,大约阅读时间需要 24 分钟。

【现象】

在ajax通过web代理跨域访问时,http第一次登陆时正常,但是第二次再下发其他命令的时候总是返回 java.net.SocketTimeoutException: Read timed out

【定位思路】

  第一次登陆正常,第二次再访问就不行,说明大多数是和cookie相关。页面在登陆的时候设置cookie是成功的,那么大部分的原因应该是在web代理部分cookie的传输有问题了。仔细看了代理部分的代码,发现web代理部分建立新的http请求的时候,并没有添加cookie。然后上网查找cookie的获得和添加方式。添加上就可以了。

【前台页面代码】

登陆代码:

function DoLogin()                            {   m_szUserPwdValue = Base64.encode("admin" + ":" + "12345");  $.ajax({      type: "GET",      url: m_lHttp + m_szHostName + ":" + m_lHttpPort + "/onlineObservationSystem/PSIA/Custom/SelfExt/userCheck",      async: true,      timeout: 15000,      beforeSend: function(xhr) {          xhr.setRequestHeader("If-Modified-Since", "0");          xhr.setRequestHeader("Authorization", "Basic " + m_szUserPwdValue);      },      success: function(xmlDoc, textStatus, xhr)       {        alert("login success");          if("200" == xhr.status)          {              var szUrl = decodeURI(document.URL);              if(szUrl.indexOf("?page=") != -1)              {                  var szPage = szUrl.substring(szUrl.indexOf("page=") + 5, szUrl.indexOf("&params="));                  if(szPage.indexOf(".asp") == -1)                  {                      szPage = szPage.concat(".asp");                  }                  var szParam = szUrl.substring(szUrl.indexOf("&params=") + 8, szUrl.length);                  $.cookie('page',szPage+"?"+szParam+"%1");              }              else              {                  $.cookie('page',null);              }              //登陆的时候在这里添加cookie              $.cookie('userInfo'+'80',m_szUserPwdValue==""?Base64.encode("anonymous:\177\177\177\177\177\177"):m_szUserPwdValue);              //window.location.href = "IEfile/doc/page/main.asp";          }          else          {                 if(!$('#UserName').prop("disabled")) {                  $('#UserName').focus();              }              $('#UserName').val('');              $('#Password').val('');              alert(translator.translateNode(g_lxdLogin, 'LoginTips4'));          }      },      error: function(xhr, textStatus, errorThrown)      {        alert("login error = " + textStatus);          if("timeout" == textStatus)          {              alert(translator.translateNode(g_lxdLogin, 'ConnectTimeoutTips'));          }          else          {              alert(translator.translateNode(g_lxdLogin, 'NetworkErrorTips'));          }      }  });}

第二次访问的代码:

function GetPatrolsCab() {    $.ajax({        type: "GET",        url: m_lHttp + m_szHostName + ":" + m_lHttpPort + "/onlineObservationSystem/PSIA/PTZ/channels/1/patrols",        async: true,        timeout: 15000,        beforeSend: function(xhr) {            xhr.setRequestHeader("If-Modified-Since", "0");            xhr.setRequestHeader("Authorization", "Basic " + m_szUserPwdValue);        },        success: function(xmlDoc, textStatus, xhr) {            var iLen = $(xmlDoc).find('PTZPatrol').length;            if(0 == iLen) {                alert("get path success,but iLen=0");                //m_oPtzTabs.hideTab(1);                return;            }            $("#selectPatrol").empty();            var szName = parent.translator.translateNode(g_lxdPreview, 'laTrack');            for(var i = 0; i < iLen; i++) {                if (i < 9) {                    $("").appendTo("#selectPatrol");                } else {                    $("").appendTo("#selectPatrol");                }            }            $("#selectPatrol").unbind().bind("change",function() {                GetPatrol(this.value);            });            GetPatrolsDelayCab();        },        error: function(XMLHttpRequest, textStatus, errorThrown) {            alert("get path error");            //m_oPtzTabs.hideTab(1);        }    });}

 

【web代理代码,就是servlet端代码】

package com.boomdts.weather_monitor.servlet.video;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.charset.Charset;import java.util.List;import javax.servlet.*;import javax.servlet.http.*;public class psiaFilter implements javax.servlet.Filter {        public void destroy() {        }        //char数组转换成byte数组        private byte[] getBytes (char[] chars) {           Charset cs = Charset.forName ("UTF-8");           CharBuffer cb = CharBuffer.allocate (chars.length);           cb.put (chars);           cb.flip ();           ByteBuffer bb = cs.encode (cb);           return bb.array();        }        //byte数组转换成char数组        private char[] getChars (byte[] bytes) {            Charset cs = Charset.forName ("UTF-8");            ByteBuffer bb = ByteBuffer.allocate (bytes.length);            bb.put (bytes);            bb.flip ();            CharBuffer cb = cs.decode (bb);            System.out.println("in size=" + bytes.length + "out size = " + cb.array().length);            return cb.array();        }        public void doFilter(ServletRequest request, ServletResponse response,                FilterChain chain) throws IOException, ServletException {            //根据当前请求内容获得请求的各个参数            HttpServletRequest req = (HttpServletRequest)(request);            String uri = req.getRequestURI();            uri = uri.substring(24);//删除当前项目名称的字符串            String Auth = req.getHeader("Authorization");            String method = req.getMethod();            Cookie[] cookies = req.getCookies();//取得cookie,这个原来是没有添加的            HttpServletResponse res = (HttpServletResponse)(response);            //发起一个新的http连接,设置新建连接的参数(就是把刚才请求的参数设置成新的连接的参数)。            String url= "http://172.16.8.178" + uri;            //System.out.println("url = " + url);            URL theURL = new URL(url);            HttpURLConnection urlConnection = (HttpURLConnection)theURL.openConnection();            urlConnection.setReadTimeout(500000);            System.out.println("method = " + method);            urlConnection.setRequestMethod(method);            urlConnection.setRequestProperty("If-Modified-Since", "0");            urlConnection.setRequestProperty("Authorization", Auth);            for(Cookie c:cookies){                urlConnection.addRequestProperty("Cookie",  c.getName() + "=" + c.getValue());//添加cookie,这个原来是没有添加的                //System.out.println("cookie  name=" + c.getName() +"; value=" + c.getValue());            }            urlConnection.connect();                                    PrintWriter out = res.getWriter();            //取得http连接响应数据,并把响应数据返回前台页面            if (urlConnection.getResponseCode() == 200)            {                System.out.println("urlConnection return success");                //解析返回信息                InputStream in = urlConnection.getInputStream();                int c;                while((c = in.read()) != -1)                    out.write(c);                             } else {                System.out.println("error! urlConnection.getResponseCode() = " + urlConnection.getResponseCode());            }        }        public void init(FilterConfig arg0) throws ServletException {        }    }

 

 

相关内容请参考我的另外两篇博客:

 

转载于:https://www.cnblogs.com/matthew-2013/p/3512132.html

你可能感兴趣的文章
无根树转有根树
查看>>
汇编试验三:编程、编译、连接、跟踪
查看>>
tar 打包带软连接的文件
查看>>
数据库中Schema(模式)概念的理解
查看>>
构建之法阅读笔记01
查看>>
Item 2:Prefer C++-style casts.(More Effective C++)
查看>>
Delegation and Core Location(Chapter 4 of iOS Programming: The Big Nerd Ranch Guide)
查看>>
HDU 4001 To Miss Our Children Time dp
查看>>
配置使用dwr完成收邮件提示
查看>>
know more about Dubai history
查看>>
利用 WSGI 模块运行 Flask 生成的网页
查看>>
VS连接数据库的通用方法(SQL/MySql)
查看>>
二分图之最小边覆盖(poj3020)
查看>>
linux 系统升级中的一些配置
查看>>
词性标注
查看>>
swift 类和结构体
查看>>
mono支持gb2312
查看>>
SharePoint 数据库迁移步骤
查看>>
Python基础
查看>>
洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
查看>>