为什么会发生ionic 跨域请求问题的问题

本帖子已过去太久远了,不再提供回复功能。浏览器跨域问题的总结
浏览器跨域问题的总结
JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。我们在项目开发中遇到了几种跨域情形,现在进行一些总结,也对互联网上凌乱的东西进行一些总结,着重描述上述一些情景,以下列举跨域问题的几种情形
是否允许通信
同一域名下
/script/b.js
同一域名下不同文件夹
:8000/a.js
同一域名,不同端口
同一域名,不同协议
域名和域名对应ip
主域相同,子域不同
同一域名,不同二级域名(同上)
不允许(cookie这种情况下也不允许访问)
特别注意两点:
第一,如果是协议和端口造成的跨域问题“前台”是无能为力的,
第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。
“URL的首部”指window.location.protocol&+window.location.host,也可以理解为“Domains,&protocols&and&ports&must&match”。
.document.domain+iframe情形
对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。具体的做法是可以在/a.html和/b.html两个文件中分别加上document.domain&=&‘a.com’;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把的domian设为那显然是会报错地!代码如下:
上的a.html
document.domain&=&'a.com';
var&ifr&=&document.createElement_x('iframe');
ifr.src&=&'/b.html';
ifr.style.display&=&'none';
document.body.appendChild(ifr);
ifr.onload&=&function(){
&&&&var&doc&=&ifr.contentDocument&||&ifr.contentWindow.
&&&&//&在这里操纵b.html
&&&&alert(doc.getElementsByTagName_r("h1")[0].childNodes[0].nodeValue);
上的b.html
document.domain&=&'a.com';
这种方式适用于{,&<,&,&}中的任何页面相互通信。
某一页面的domain默认等于window.location.hostname。主域名是不带www的域名,例如a.com,主域名前面带前缀的通常都为二级域名或多级域名,例如其实是二级域名。&domain只能设置为主域名,不可以在中将domain设置为。
1、安全性,当一个站点()被攻击后,另一个站点()会引起安全漏洞。
2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。我们工行商城IM联调过程中尝试过这种方式,最终因为影响页面其他iframe的功能而放弃。最终我们调整了融e购的IM前端结构.
JSONP是一个非官方的协议,它允许在服务器端集成Script&tags返回至客户端,通过javascript&callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。JSON系统开发方法是一种典型的面向数据结构的分析和设计方法,以活动为中心,一连串的活动的顺序组合成一个完整的工作进程。
$.getJSON(url+"?callback=?",&&&&
&&&&&&&&&&&function(json){&&&&
&&&&&&&});&&
$.ajax({&&&&
&&&&&&&&&&&url:&'',&&//&跨域URL&&&
&&&&&&&&&&&type:&'GET',&&&&
&&&&&&&&&&&dataType:&'jsonp',&&&&
&&&&&&&&&&&jsonp:&'jsoncallback',&//默认callback&&&
&&&&&&&&&&&data:&mydata,&//请求数据&&&
&&&&&&&&&&&timeout:&5000,&
&&&&&&&&&&&success:&function&(json)&{&//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数&&&&
&&&&&&&&&&&&&&&if(json.actionErrors.length!=0){&&&&
&&&&&&&&&&&&&&&&&&&alert(json.actionErrors);&&&&
&&&&&&&&&&&&&&&}&&&&
&&&&&&&&&&&},&&&&
&&&&&&&&&&&complete:&function(XMLHttpRequest,&textStatus){&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&}
&&&&&&&});&&
最新的W3C标准里是这么实现HTTP跨域请求的跨域的目标服务器要返回一系列的Headers,通过这些Headers来控制是否同意跨域。
Access-Control-Allow-Origin&这个&Header在W3C标准里用来检查该跨域请求是否可以被通过。
从&/test.html&发起一个跨域请求,请求的地址为:&&如果&服务器B返回一个如下的header,Access-Control-Allow-Origin:&,那么,这个来自&/test.html&的跨域请求就会被通过。在这个过程中,&request&还会带上这个header,Access-Control-Allow-Origin&的值可以是通配符&*
如果是&*&的话,就可以接收来自任意source&origin的请求。
IE8&问题(详情见情景4),&则是通过&XDomainRequest&来实现的这个跨域请求比如类似如下代码就可以实现了:
var&request&=&new&XDomainRequest();
request.open("GET",&xdomainurl);
request.send();
也要求对方服务器返回这个头才行。
服务器端代码的操作示例:
1.我们可以在java代码中加入&response.setHeader("Access-Control-Allow-Origin",&"*");
2.html的,须要&
3.“CrossOriginFilter”类,用于支持跨域的&JavaScript&请求,如果您的项目中要支持跨域的服务器推送,可以加入该配置。
package&net.icbc.messager.
import&java.io.IOE
import&java.util.ArrayL
import&java.util.A
import&java.util.L
import&javax.servlet.F
import&javax.servlet.FilterC
import&javax.servlet.FilterC
import&javax.servlet.ServletE
import&javax.servlet.ServletR
import&javax.servlet.ServletR
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&net.icbc.messager.web.servlet.TokenS
import&org.apache.log4j.L
public&class&CrossOriginFilter&implements&Filter
private&static&Logger&log&=&Logger.getLogger(TokenServlet.class);
//&Request&headers
&&&&private&static&final&String&ORIGIN_HEADER&=&"Origin";
&&&&private&static&final&String&ACCESS_CONTROL_REQUEST_METHOD_HEADER&=&"Access-Control-Request-Method";
&&&&private&static&final&String&ACCESS_CONTROL_REQUEST_HEADERS_HEADER&=&"Access-Control-Request-Headers";
&&&&//&Response&headers
&&&&private&static&final&String&ACCESS_CONTROL_ALLOW_ORIGIN_HEADER&=&"Access-Control-Allow-Origin";
&&&&private&static&final&String&ACCESS_CONTROL_ALLOW_METHODS_HEADER&=&"Access-Control-Allow-Methods";
&&&&private&static&final&String&ACCESS_CONTROL_ALLOW_HEADERS_HEADER&=&"Access-Control-Allow-Headers";
&&&&private&static&final&String&ACCESS_CONTROL_MAX_AGE_HEADER&=&"Access-Control-Max-Age";
&&&&private&static&final&String&ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER&=&"Access-Control-Allow-Credentials";
&&&&//&Implementation&constants
&&&&private&static&final&String&ALLOWED_ORIGINS_PARAM&=&"allowedOrigins";
&&&&private&static&final&String&ALLOWED_METHODS_PARAM&=&"allowedMethods";
&&&&private&static&final&String&ALLOWED_HEADERS_PARAM&=&"allowedHeaders";
&&&&private&static&final&String&PREFLIGHT_MAX_AGE_PARAM&=&"preflightMaxAge";
&&&&private&static&final&String&ALLOWED_CREDENTIALS_PARAM&=&"allowCredentials";
&&&&private&static&final&String&ANY_ORIGIN&=&"*";
&&&&private&static&final&List&SIMPLE_HTTP_METHODS&=&Arrays.asList("GET",&"POST",&"HEAD");
&&&&private&boolean&anyOriginAllowed&=&
&&&&private&List&allowedOrigins&=&new&ArrayList();
&&&&private&List&allowedMethods&=&new&ArrayList();
&&&&private&List&allowedHeaders&=&new&ArrayList();
&&&&private&int&preflightMaxAge&=&0;
&&&&private&boolean&allowCredentials&=&
&&&&public&void&init(FilterConfig&config)&throws&ServletException
&&&&&&&&String&allowedOriginsConfig&=&config.getInitParameter(ALLOWED_ORIGINS_PARAM);
&&&&&&&&if&(allowedOriginsConfig&==&null)&allowedOriginsConfig&=&"*";
&&&&&&&&String[]&allowedOrigins&=&allowedOriginsConfig.split(",");
&&&&&&&&for&(String&allowedOrigin&:&allowedOrigins)
&&&&&&&&&&&&allowedOrigin&=&allowedOrigin.trim();
&&&&&&&&&&&&if&(allowedOrigin.length()&&&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(ANY_ORIGIN.equals(allowedOrigin))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&anyOriginAllowed&=&
&&&&&&&&&&&&&&&&&&&&this.allowedOrigins.clear();
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&this.allowedOrigins.add(allowedOrigin);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&String&allowedMethodsConfig&=&config.getInitParameter(ALLOWED_METHODS_PARAM);
&&&&&&&&if&(allowedMethodsConfig&==&null)&allowedMethodsConfig&=&"GET,POST";
&&&&&&&&allowedMethods.addAll(Arrays.asList(allowedMethodsConfig.split(",")));
&&&&&&&&String&allowedHeadersConfig&=&config.getInitParameter(ALLOWED_HEADERS_PARAM);
&&&&&&&&if&(allowedHeadersConfig&==&null)&allowedHeadersConfig&=&"X-Requested-With,Content-Type,Accept,Origin";
&&&&&&&&allowedHeaders.addAll(Arrays.asList(allowedHeadersConfig.split(",")));
&&&&&&&&String&preflightMaxAgeConfig&=&config.getInitParameter(PREFLIGHT_MAX_AGE_PARAM);
&&&&&&&&if&(preflightMaxAgeConfig&==&null)&preflightMaxAgeConfig&=&"1800";&//&Default&is&30&minutes
&&&&&&&&try
&&&&&&&&&&&&preflightMaxAge&=&Integer.parseInt(preflightMaxAgeConfig);
&&&&&&&&catch&(NumberFormatException&x)
&&&&&&&&&&&&<("Cross-origin&filter,&could&not&parse&'{}'&parameter&as&integer:&{}"+&PREFLIGHT_MAX_AGE_PARAM+&preflightMaxAgeConfig);
&&&&&&&&String&allowedCredentialsConfig&=&config.getInitParameter(ALLOWED_CREDENTIALS_PARAM);
&&&&&&&&if&(allowedCredentialsConfig&==&null)&allowedCredentialsConfig&=&"false";
&&&&&&&&allowCredentials&=&Boolean.parseBoolean(allowedCredentialsConfig);
&&&&&&&&log.debug("Cross-origin&filter&configuration:&"&+
&&&&&&&&&&&&&&&&&&ALLOWED_ORIGINS_PARAM&+&"&=&"&+&allowedOriginsConfig&+&",&"&+
&&&&&&&&&&&&&&&&&&ALLOWED_METHODS_PARAM&+&"&=&"&+&allowedMethodsConfig&+&",&"&+
&&&&&&&&&&&&&&&&&&ALLOWED_HEADERS_PARAM&+&"&=&"&+&allowedHeadersConfig&+&",&"&+
&&&&&&&&&&&&&&&&&&PREFLIGHT_MAX_AGE_PARAM&+&"&=&"&+&preflightMaxAgeConfig&+&",&"&+
&&&&&&&&&&&&&&&&&&ALLOWED_CREDENTIALS_PARAM&+&"&=&"&+&allowedCredentialsConfig);
&&&&public&void&doFilter(ServletRequest&request,&ServletResponse&response,&FilterChain&chain)&throws&IOException,&ServletException
&&&&&&&&handle((HttpServletRequest)request,&(HttpServletResponse)response,&chain);
&&&&private&void&handle(HttpServletRequest&request,&HttpServletResponse&response,&FilterChain&chain)&throws&IOException,&ServletException
&&&&&&&&String&origin&=&request.getHeader(ORIGIN_HEADER);
&&&&&&&&//&Is&it&a&cross&origin&request&?
&&&&&&&&if&(origin&!=&null&&&&isEnabled(request))
&&&&&&&&&&&&if&(originMatches(origin))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(isSimpleRequest(request))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&log.debug("Cross-origin&request&to&{}&is&a&simple&cross-origin&request"+&request.getRequestURI());
&&&&&&&&&&&&&&&&&&&&handleSimpleResponse(request,&response,&origin);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&log.debug("Cross-origin&request&to&{}&is&a&preflight&cross-origin&request"&+request.getRequestURI());
&&&&&&&&&&&&&&&&&&&&handlePreflightResponse(request,&response,&origin);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&log.debug("Cross-origin&request&to&"&+&request.getRequestURI()&+&"&with&origin&"&+&origin&+&"&does&not&match&allowed&origins&"&+&allowedOrigins);
&&&&&&&&&&&&}
&&&&&&&&chain.doFilter(request,&response);
&&&&protected&boolean&isEnabled(HttpServletRequest&request)
&&&&&&&&//&WebSocket&clients&such&as&Chrome&5&implement&a&version&of&the&WebSocket
&&&&&&&&//&protocol&that&does&not&accept&extra&response&headers&on&the&upgrade&response
&&&&&&&&if&("Upgrade".equalsIgnoreCase(request.getHeader("Connection"))&&&
&&&&&&&&&&&&"WebSocket".equalsIgnoreCase(request.getHeader("Upgrade")))
&&&&&&&&&&&&return&
&&&&&&&&return&
&&&&private&boolean&originMatches(String&origin)
&&&&&&&&if&(anyOriginAllowed)&return&
&&&&&&&&for&(String&allowedOrigin&:&allowedOrigins)
&&&&&&&&&&&&if&(allowedOrigin.equals(origin))&return&
&&&&&&&&return&
&&&&private&boolean&isSimpleRequest(HttpServletRequest&request)
&&&&&&&&String&method&=&request.getMethod();
&&&&&&&&if&(SIMPLE_HTTP_METHODS.contains(method))
&&&&&&&&&&&&//&TODO:&implement&better&section&6.1
&&&&&&&&&&&&//&Section&6.1&says&that&for&a&request&to&be&simple,&custom&request&headers&must&be&simple.
&&&&&&&&&&&&//&Here&for&simplicity&I&just&check&if&there&is&a&Access-Control-Request-Method&header,
&&&&&&&&&&&&//&which&is&required&for&preflight&requests
&&&&&&&&&&&&return&request.getHeader(ACCESS_CONTROL_REQUEST_METHOD_HEADER)&==&
&&&&&&&&return&
&&&&private&void&handleSimpleResponse(HttpServletRequest&request,&HttpServletResponse&response,&String&origin)
&&&&&&&&response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN_HEADER,&origin);
&&&&&&&&if&(allowCredentials)&response.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER,&"true");
&&&&private&void&handlePreflightResponse(HttpServletRequest&request,&HttpServletResponse&response,&String&origin)
&&&&&&&&//&Implementation&of&section&5.2
&&&&&&&&//&5.2.3&and&5.2.5
&&&&&&&&boolean&methodAllowed&=&isMethodAllowed(request);
&&&&&&&&if&(!methodAllowed)&
&&&&&&&&//&5.2.4&and&5.2.6
&&&&&&&&boolean&headersAllowed&=&areHeadersAllowed(request);
&&&&&&&&if&(!headersAllowed)&
&&&&&&&&//&5.2.7
&&&&&&&&response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN_HEADER,&origin);
&&&&&&&&if&(allowCredentials)&response.setHeader(ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER,&"true");
&&&&&&&&//&5.2.8
&&&&&&&&if&(preflightMaxAge&&&0)&response.setHeader(ACCESS_CONTROL_MAX_AGE_HEADER,&String.valueOf(preflightMaxAge));
&&&&&&&&//&5.2.9
&&&&&&&&response.setHeader(ACCESS_CONTROL_ALLOW_METHODS_HEADER,&commify(allowedMethods));
&&&&&&&&//&5.2.10
&&&&&&&&response.setHeader(ACCESS_CONTROL_ALLOW_HEADERS_HEADER,&commify(allowedHeaders));
&&&&private&boolean&isMethodAllowed(HttpServletRequest&request)
&&&&&&&&String&accessControlRequestMethod&=&request.getHeader(ACCESS_CONTROL_REQUEST_METHOD_HEADER);
&&&&&&&&log.debug("{}&is&{}"+&ACCESS_CONTROL_REQUEST_METHOD_HEADER+&accessControlRequestMethod);
&&&&&&&&boolean&result&=&
&&&&&&&&if&(accessControlRequestMethod&!=&null)
&&&&&&&&&&&&result&=&allowedMethods.contains(accessControlRequestMethod);
&&&&&&&&log.debug("Method&{}&is"&+&(result&?&""&:&"&not")&+&"&among&allowed&methods&{}"+accessControlRequestMethod+allowedMethods);
&&&&&&&&return&
&&&&private&boolean&areHeadersAllowed(HttpServletRequest&request)
&&&&&&&&String&accessControlRequestHeaders&=&request.getHeader(ACCESS_CONTROL_REQUEST_HEADERS_HEADER);
&&&&&&&&log.debug("{}&is&{}"+&ACCESS_CONTROL_REQUEST_HEADERS_HEADER+&&accessControlRequestHeaders);
&&&&&&&&boolean&result&=&
&&&&&&&&if&(accessControlRequestHeaders&!=&null)
&&&&&&&&&&&&String[]&headers&=&accessControlRequestHeaders.split(",");
&&&&&&&&&&&&for&(String&header&:&headers)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&boolean&headerAllowed&=&
&&&&&&&&&&&&&&&&for&(String&allowedHeader&:&allowedHeaders)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(header.trim().equalsIgnoreCase(allowedHeader.trim()))
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&headerAllowed&=&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&(!headerAllowed)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&result&=&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&log.debug("Headers&[{}]&are"&+&(result&?&""&:&"&not")&+&"&among&allowed&headers&{}"+accessControlRequestHeaders+allowedHeaders);
&&&&&&&&return&
&&&&private&String&commify(List&strings)
&&&&&&&&StringBuilder&builder&=&new&StringBuilder();
&&&&&&&&for&(int&i&=&0;&i&&&strings.size();&++i)
&&&&&&&&&&&&if&(i&&&0)&builder.append(",");
&&&&&&&&&&&&String&string&=&strings.get(i);
&&&&&&&&&&&&builder.append(string);
&&&&&&&&return&builder.toString();
&&&&public&void&destroy()
&&&&&&&&anyOriginAllowed&=&
&&&&&&&&allowedOrigins.clear();
&&&&&&&&allowedMethods.clear();
&&&&&&&&allowedHeaders.clear();
&&&&&&&&preflightMaxAge&=&0;
&&&&&&&&allowCredentials&=&
Fileter配置信息:
&&&&&&&&&cross-origin
&&&&&&&&&net.icbc.messager.web.CrossOriginFilter
&&&&&&&&&cross-origin
&&&&&&&&&/*
情景4需在情景3的基础上进行,仅仅进行情景3的设置,是在IE8下行不通的.
通过使用&Internet&Explorer&8&中的跨域请求(缩写为“XDR”),开发人员可以创建跨网站数据聚合方案。&这个名为&&的请求与&&对象类似,但编程模型更加简单,它可以提供一种最简单的方式来向支持&XDR&的第三方站点发出匿名请求,并选择使这些站点的数据可跨域使用。&只需三行代码即可生成基本的跨站点请求。&这将确保针对公共站点(例如,博客或其他社交网络应用程序)的数据聚合简单、安全和快速。
下面的&JavaScript&代码介绍&XDomainRequest&对象及其事件、属性和方法。&&参考页提供了比此处更为详细的信息。
//&Creates&a&new&XDR&object.
xdr&=&new&XDomainRequest();&&
//&Indicates&there&is&an&error&and&the&request&cannot&be&completed.&
xdr.onerror&=&alert_
&&&&&&&&&&&&&&&&&&&&&&&&
//&The&request&has&reached&its&timeout.&
xdr.ontimeout&=&alert_
&&&&&&&&&&&&&&&&&&&&&&&&
//&The&object&has&started&returning&data.
xdr.onprogress&=&alert_
&&&&&&&&&&&&&&&&&&&&&&&&
//&The&object&is&complete.&
xdr.onload&=&alert_
//&Sets&the&timeout&interval.
xdr.timeout&=&
//&Gets&the&content-type&header&in&the&request.
var&content_type&=&xdr.contentT
//&Gets&the&body&of&the&response.
var&response&=&xdr.responseT
&&&&&&&&&&&&&&&&&&&&&&&&
//&Creates&a&connection&with&a&domain's&server.&
xdr.open("get",&url);
//&Transmits&a&data&string&to&the&server.&
xdr.send();
//&Terminates&a&pending&send.
xdr.abort();
附:IE8下的跨域js的兼容设置,实现XDR对象到XHR对象的转换&ieXDRToXHR.js&(注此js会对jQuery形成干扰)
if&(window.XDomainRequest)&{
&&&&windows.ieXDRToXHR&=&function(window)&{
&&&&&&&&"use&strict";
&&&&&&&&var&XHR&=&window.XMLHttpR
&&&&&&&&window.XMLHttpRequest&=&function()&{
&&&&&&&&&&&&this.onreadystatechange&=&O
&&&&&&&&&&&&this.xhr&=&
&&&&&&&&&&&&this.xdr&=&
&&&&&&&&&&&&this.readyState&=&0;
&&&&&&&&&&&&this.status&=&'';
&&&&&&&&&&&&this.statusText&=&
&&&&&&&&&&&&this.responseText&=&
&&&&&&&&&&&&this.getResponseHeader&=&
&&&&&&&&&&&&this.getAllResponseHeaders&=&
&&&&&&&&&&&&this.setRequestHeader&=&
&&&&&&&&&&&&this.abort&=&
&&&&&&&&&&&&this.send&=&
&&&&&&&&&&&&this.isxdr&=&
&&&&&&&&&&&&//&static&binding
&&&&&&&&&&&&var&self&=&
&&&&&&&&&&&&self.xdrLoadedBinded&=&function()&{
&&&&&&&&&&&&&&&&self.xdrLoaded();
&&&&&&&&&&&&};
&&&&&&&&&&&&self.xdrErrorBinded&=&function()&{
&&&&&&&&&&&&&&&&self.xdrError();
&&&&&&&&&&&&};
&&&&&&&&&&&&self.xdrProgressBinded&=&function()&{
&&&&&&&&&&&&&&&&self.xdrProgress();
&&&&&&&&&&&&};
&&&&&&&&&&&&self.xhrReadyStateChangedBinded&=&function()&{
&&&&&&&&&&&&&&&&self.xhrReadyStateChanged();
&&&&&&&&&&&&};
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.open&=&function(method,&url,&asynch,&user,&pwd)&{
&&&&&&&&&&&&//improve&CORS&deteciton&(chat.example.net&exemple.net),&remove&hardcoded&http-bind
&&&&&&&&&&&&var&parser&=&document.createElement_x('a');
&&&&&&&&&&&&parser.href&=&
&&&&&&&&&&&&if&(parser.hostname!=document.domain)&{
&&&&&&&&&&&&&&&&if&(this.xdr&===&null){
&&&&&&&&&&&&&&&&&&&&this.xdr&=&new&window.XDomainRequest();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&this.isxdr&=&
&&&&&&&&&&&&&&&&this.setXDRActive();
&&&&&&&&&&&&&&&&this.xdr.open(method,&url);
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&if&(this.xhr&===&null){
&&&&&&&&&&&&&&&&&&&&this.xhr&=&new&XHR();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&this.isxdr&=&
&&&&&&&&&&&&&&&&this.setXHRActive();
&&&&&&&&&&&&&&&&this.xhr.open(method,&url,&asynch,&user,&pwd);
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrGetResponseHeader&=&function(name)&{
&&&&&&&&&&&&if&(name&===&'Content-Type'&&&&this.xdr.contentType&&&''){
&&&&&&&&&&&&&&&&return&this.xdr.contentT
&&&&&&&&&&&&}
&&&&&&&&&&&&return&'';
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrGetAllResponseHeaders&=&function()&{
&&&&&&&&&&&&return&(this.xdr.contentType&&&'')&?&'Content-Type:&'&+&this.xdr.contentType&:&'';
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrSetRequestHeader&=&function(name,&value)&{
&&&&&&&&&&&&//throw&new&Error('Request&headers&not&supported');
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrLoaded&=&function()&{
&&&&&&&&&&&&if&(this.onreadystatechange&!==&null)&{
&&&&&&&&&&&&&&&&this.readyState&=&4;
&&&&&&&&&&&&&&&&this.status&=&200;
&&&&&&&&&&&&&&&&this.statusText&=&'OK';
&&&&&&&&&&&&&&&&this.responseText&=&this.xdr.responseT
&&&&&&&&&&&&&&&&if&(window.ActiveXObject){
&&&&&&&&&&&&&&&&&&&&var&doc&=&new&ActiveXObject('Microsoft.XMLDOM');
&&&&&&&&&&&&&&&&&&&&doc.async='false';
&&&&&&&&&&&&&&&&&&&&doc.loadXML(this.responseText);
&&&&&&&&&&&&&&&&&&&&this.responseXML&=&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&this.onreadystatechange();
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrError&=&function()&{
&&&&&&&&&&&&if&(this.onreadystatechange&!==&null)&{
&&&&&&&&&&&&&&&&this.readyState&=&4;
&&&&&&&&&&&&&&&&this.status&=&0;
&&&&&&&&&&&&&&&&this.statusText&=&'';
&&&&&&&&&&&&&&&&//&???
&&&&&&&&&&&&&&&&this.responseText&=&'';
&&&&&&&&&&&&&&&&this.onreadystatechange();
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xdrProgress&=&function()&{
&&&&&&&&&&&&if&(this.onreadystatechange&!==&null&&&&this.status&!==&3)&{
&&&&&&&&&&&&&&&&this.readyState&=&3;
&&&&&&&&&&&&&&&&this.status&=&3;
&&&&&&&&&&&&&&&&this.statusText&=&'';
&&&&&&&&&&&&&&&&this.onreadystatechange();
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.finalXDRRequest&=&function()&{
&&&&&&&&&&&&var&xdr&=&this.
&&&&&&&&&&&&delete&xdr.AZ
&&&&&&&&&&&&delete&xdr.
&&&&&&&&&&&&delete&xdr.
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.sendXDR&=&function(data)&{
&&&&&&&&&&&&var&xdr&=&this.
&&&&&&&&&&&&xdr.onload&=&this.xdrLoadedB
&&&&&&&&&&&&xdr.onerror&=&this.xdr.ontimeout&=&this.xdrErrorB
&&&&&&&&&&&&xdr.onprogress&=&this.xdrProgressB
&&&&&&&&&&&&this.responseText&=&
&&&&&&&&&&&&this.xdr.send(data);
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.abortXDR&=&function()&{
&&&&&&&&&&&&this.finalXDRRequest();
&&&&&&&&&&&&this.xdr.abort();
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.setXDRActive&=&function()&{
&&&&&&&&&&&&this.send&=&this.sendXDR;
&&&&&&&&&&&&this.abort&=&this.abortXDR;
&&&&&&&&&&&&this.getResponseHeader&=&this.xdrGetResponseH
&&&&&&&&&&&&this.getAllResponseHeaders&=&this.xdrGetAllResponseHeaders;
&&&&&&&&&&&&this.setRequestHeader&=&this.xdrSetRequestH
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xhrGetResponseHeader&=&function(name)&{
&&&&&&&&&&&&return&this.xhr.getResponseHeader(name);
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xhrGetAllResponseHeaders&=&function()&{
&&&&&&&&&&&&return&this.xhr.getAllResponseHeaders();
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xhrSetRequestHeader&=&function(name,&value)&{
&&&&&&&&&&&&return&this.xhr.setRequestHeader(name,&value);
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.xhrReadyStateChanged&=&function()&{
&&&&&&&&&&&&if&(this.onreadystatechange&!==&null&&&&this.readyState&!==&this.xhr.readyState)&{
&&&&&&&&&&&&&&&&var&xhr&=&this.
&&&&&&&&&&&&&&&&this.readyState&=&xhr.readyS
&&&&&&&&&&&&&&&&if&(this.readyState&===&4)&{
&&&&&&&&&&&&&&&&&&&&this.status&=&xhr.
&&&&&&&&&&&&&&&&&&&&this.statusText&=&xhr.statusT
&&&&&&&&&&&&&&&&&&&&this.responseText&=&xhr.responseT
&&&&&&&&&&&&&&&&&&&&this.responseXML&=&xhr.responseXML;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&this.onreadystatechange();
&&&&&&&&&&&&}
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.finalXHRRequest&=&function()&{
&&&&&&&&&&&&delete&this.xhr.
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.abortXHR&=&function()&{
&&&&&&&&&&&&this.finalXHRRequest();
&&&&&&&&&&&&this.xhr.abort();
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.sendXHR&=&function(data)&{
&&&&&&&&&&&&this.xhr.onreadystatechange&=&this.xhrReadyStateChangedBind
&&&&&&&&&&&&this.xhr.send(data);
&&&&&&&&};
&&&&&&&&XMLHttpRequest.prototype.setXHRActive&=&function()&{
&&&&&&&&&&&&this.send&=&this.sendXHR;
&&&&&&&&&&&&this.abort&=&this.abortXHR;
&&&&&&&&&&&&this.getResponseHeader&=&this.xhrGetResponseH
&&&&&&&&&&&&this.getAllResponseHeaders&=&this.xhrGetAllResponseHeaders;
&&&&&&&&&&&&this.setRequestHeader&=&this.xhrSetRequestH
&&&&&&&&};
&&&&&&&&windows.ieXDRToXHR&=&
&&&&windows.ieXDRToXHR(window);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 怎么解决跨域问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信