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 ...
随机推荐
- Android之Http沟通——4.Android HTTP索取信息:HttpClient
本节介绍: 他谈到了部分HttpURLConnection.本节HttpClient该,Apache为我们提供HttpClient(简单的Http客户端),只是毕竟不是亲儿子.HttpClient在A ...
- SQL Server使用规范
原文:SQL Server使用规范 常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 ...
- Linux centos 主机名颜色设置 和 别名设置
方便和乐趣写今天.至于为什么主机名颜色设置 和 别名设置放在一起写.这是因为他们的设置是在一个文件中..bashrc. .bashrc放在cd /root 这个文件夹下! 这个文件主要保存个人的一些个 ...
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...
- HDU 2841 Visible Trees(数论)
标题效果:给你个m*n方格,广场格从(1,1)开始. 在树中的每个点,然后让你(0,0)点往下看,问:你能看到几棵树. 解题思路:假设你的视线被后面的树和挡住的话以后在这条线上的树你是都看不见的啊.挡 ...
- React.js初探(一)
前端框架多如牛毛的今天,团队的技术选型很重要,没有最好的,只有最合适的,这话早已经被说烂了. 但是作为一个有追求的前端,对新技术的敏感以及尝试心理还是要有的. 虽然React已经火的不行了,但由于自己 ...
- 有趣Web之Json(四)---json与(Object/List/Map)相互转化
干web报名时间.通常,他们需要json转换为Object/list/map要么Object/List/map转换为json,由能够编写代码的简单包装非常多,以减轻负担. 本文将给出json的一系列的 ...
- 一个意想不到的CDO.Message 错误
原文:一个意想不到的CDO.Message 错误 几个月之前,写了一个服务从MSMQ取消息发群发邮件的程序,一直也没时间测试,今日一试,出现发送邮件时报错,异常情况如下: "Syst ...
- 【iOS】iOS它Container View获得ViewController
近期使用Container View来在主View Controller建立自己的子Controller,但是遇到问题.不知道怎样用代码获取Controller View附带的View Control ...
- 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)
最近遇到一个很奇怪的事情,Windows上的 IIS 网站 全关掉了,80端口仍然被占用.然后我新装了一台服务器,一个一个组件地装,装一个测一次,最后发现,WebDeploy这个组件,会占用80端口. ...