web代理进行跨域访问
通过web代理进行跨域访问,http请求返回超时的问题定位
【现象】
在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("¶ms="));
if(szPage.indexOf(".asp") == -1)
{
szPage = szPage.concat(".asp");
}
var szParam = szUrl.substring(szUrl.indexOf("¶ms=") + 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) {
$("<option value='"+ (i+1) +"'>"+szName+" 0"+(i+1)+"</option>").appendTo("#selectPatrol");
} else {
$("<option value='"+ (i+1) +"'>"+szName+" "+(i+1)+"</option>").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 {
} }

相关内容请参考我的另外两篇博客:
ajax跨域访问的解决方案
jquery.cookie.js使用介绍
web代理进行跨域访问的更多相关文章
- 通过web代理进行跨域访问,http请求返回超时的问题定位
[现象] 在ajax通过web代理跨域访问时,http第一次登陆时正常,但是第二次再下发其他命令的时候总是返回 java.net.SocketTimeoutException: Read timed ...
- Nginx作为静态资源web服务之跨域访问
Nginx作为静态资源web服务之跨域访问 首先了解一下什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相 ...
- web多站点跨域访问
有时项目app和m 需要公用一套接口 这个时候就要用到跨域:特别是app接口跨域访问站点时. 跨域配置: 1.iis服务器上需要安装URLwrite2.0 2.web.config 需要添加这个配置: ...
- nginx介绍(六) - 通过反向代理实现跨域访问
前言 跨域访问问题, 相信很多人都遇到过, 并且都用不同的办法去解决过. 方法有很多种, 不一一叙述了. 这里主要使用nginx反向代理来解决跨域问题. 啥是跨域 假如你是百度开发人员, 在百度页面去 ...
- Vue之通过代理设置跨域访问
我们使用脚手架创建的项目,可以在config项目中看到
- ASP.net Web API允许跨域访问解决办法
来源 http://blog.csdn.net/wxg_kingwolfmsncn/article/details/48545099 遇到此跨域访问问题,解决办法如下: 方法一: 1. 在we ...
- java 解决nginx代理的跨域访问问题
一.什么是跨域 跨域是浏览器对JavaScript同源策略的限制 二.什么情况下会产生跨域 域名不同 wwww.baidu.com www.jd.com 域名相同,访问的端口不同 wwww.baidu ...
- AngulaJs+Web Api Cors 跨域访问失败的解决办法
//在服务的WebConfig文件中添加以下代码即可 //如节点已存在请去掉 <system.webServer> <httpProtocol> <customHeade ...
- ASP.NET Web API 启用跨域访问
自定义特性 要在WebApi中实现JSONP,一种方式是实现自定义特性 http://stackoverflow.com/questions/9421312/jsonp-with-asp-net-w ...
随机推荐
- RQNOJ PID3 / Jam的计数法
题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...
- CSDN下载频道2014年11月4日本-5日常维护公告
尊敬的用户: CSDN于2005年推出了下载服务.经过数年的发展.下载频道的用户已经为无数用户提供了帮助,分享500万的技术资源. CSDN下载频道将于2014年11月4日23点至11月5日8点进行积 ...
- JS中call、apply的用法说明
JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...
- strip 使用命令
使用 通过消除使用调试器的粘合剂和符号信息,减少扩展公共对象文件格式(XCOFF)对象文件大小. 语法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | -H | ...
- 线程同步synchronized
一Java规划共享多个线程之间数据的能力. 当线程以异步方式訪问共享数据时.有时候是不安全的或者不和逻辑的. 比方卖火车票.同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到 ...
- 用fcntl()设置堵塞函数的堵塞性质
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...
- 杭电dp题集,附链接还有解题报告!!!!!
Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f ...
- 电脑报2014年第43期 pdf高清版
电脑报2014年第43期 pdf高清版
- 分析Cocos2d-x横版ACT手游源 2、server场景
仍然一样 直接在代码 资源 下一个 上传 你可以看到自己 NFServerChangeLayer.h </pre><pre name="code" class=& ...
- MySQL 存储过程 经常使用语法
MySQL 存储过程是从 MySQL 5.0 開始添加的新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装.特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库 ...