Sys.Net.WebRequest._getRawDomain = function(url)
{
url = Sys.Net.WebRequest._resolveUrl(url);
var index = url.indexOf('://');
var prefix = url.substring(0, index + 3);
var url = url.substring(index + 3);
index = url.indexOf('/');
if (index < 0)
{
index = url.indexOf('?');
}
if (index >= 0)
{
url = url.substring(0, index);
}
return prefix + url;
}
Sys.Net.WebRequest.prototype._checkIfIsCrossDomainRequest = function()
{
var request = new XMLHttpRequest();
try
{
request.open('get', this.get_url());
return false;
}
catch(e)
{
return true;
}
}
Sys.Net.WebRequest.prototype._getDocDomain = function()Sys.Net.WebRequest._getRawDomain方法
{
if (!this._docDomain)
{
var pageDomain = Sys.Net.WebRequest._getRawDomain(window.location.href);
var requestDomain = this._getRawDomain();
var i = 0;
while (true)
{
i ++;
var c1 = pageDomain.charAt(pageDomain.length - i);
var c2 = requestDomain.charAt(requestDomain.length - i);
if (c1 !== c2)
{
break;
}
}
var url = pageDomain.substring(pageDomain.length - i + 1);
var index = url.indexOf('.');
this._docDomain = url.substring(index + 1);
}
return this._docDomain;
}
Sys.Net.WebRequest.prototype._getRawDomain = function()
{
if (!this._rawDomain)
{
this._rawDomain = Sys.Net.WebRequest._getRawDomain(this.get_url());
}
return this._rawDomain;
}
Sys.Net.XMLHttpExecutor.prototype._normalExecuteRequest =
Sys.Net.XMLHttpExecutor.prototype.executeRequest;
Sys.Net.XMLHttpExecutor.prototype.executeRequest = function()
{
if (this.get_webRequest()._checkIfIsCrossDomainRequest())
{
this._crossDomainExecuteRequest();
}
else
{
this._normalExecuteRequest();
}
}
Sys.Net.XMLHttpExecutor._iframeCache = {};
Sys.Net.XMLHttpExecutor._iframeLoaded = {};
Sys.Net.XMLHttpExecutor.prototype._crossDomainExecuteRequest = function()
{
var webRequest = this.get_webRequest();
var rawDomain = webRequest._getRawDomain();
var iframeCache = Sys.Net.XMLHttpExecutor._iframeCache;
var timeout = webRequest.get_timeout();
if (timeout > 0)
{
this._timer = window.setTimeout(this._onTimeout, timeout);
}
if (!iframeCache[rawDomain])
{
this._createIFrame();
}
else if (!Sys.Net.XMLHttpExecutor._iframeLoaded[rawDomain])
{
setTimeout(
Function.createDelegate(this, this._crossDomainExecuteRequest),
500);
}
else if (!this.get_aborted() && !this.get_timedOut())
{
document.domain = webRequest._getDocDomain();
iframeCache[rawDomain].contentWindow.sendRequest(this);
}
}
Sys.Net.XMLHttpExecutor.prototype._createIFrame = function()
{
var webRequest = this.get_webRequest();
var rawDomain = webRequest._getRawDomain();
var proxyUrl = rawDomain + "/SubDomainProxy.htm?" +
webRequest._getDocDomain();
var iframe = document.createElement('iframe');
Sys.Net.XMLHttpExecutor._iframeCache[rawDomain] = iframe;
iframe.style.display = "none";
$addHandler(iframe, 'load',
Function.createDelegate(this, this._onIFrameLoadHandler));
iframe.src = proxyUrl;
document.body.appendChild(iframe);
return iframe;
}
Sys.Net.XMLHttpExecutor.prototype._onIFrameLoadHandler = function()
{
var webRequest = this.get_webRequest();
var rawDomain = webRequest._getRawDomain();
var iframeCache = Sys.Net.XMLHttpExecutor._iframeCache;
try
{
document.domain = webRequest._getDocDomain();
if (iframeCache[rawDomain].contentWindow.sendRequest)
{
Sys.Net.XMLHttpExecutor._iframeLoaded[rawDomain] = true;
setTimeout(
Function.createDelegate(this, this._crossDomainExecuteRequest),
0);
}
else
{
throw new Error();
}
}
catch(e)
{
var iframe = iframeCache[rawDomain];
document.body.removeChild(iframe);
iframeCache[rawDomain] = null;
this._clearTimer();
webRequest.completed(Sys.EventArgs.Empty);
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<script type="text/javascript" language="javascript">
var search = window.location.search;
document.domain = search.substring(1);
if (!window.XMLHttpRequest)
{
window.XMLHttpRequest = function window$XMLHttpRequest()
{
var progIDs = [ 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP' ];
for (var i = 0; i < progIDs.length; i++)
{
try
{
var xmlHttp = new ActiveXObject(progIDs[i]);
return xmlHttp;
}
catch (ex) {}
}
return null;
}
}
function sendRequest(executor)
{
executor._webRequest = executor.get_webRequest();
if (executor._started)
{
throw window.parent.Error.invalidOperation(
window.parent.String.format(
window.parent.Sys.Res.cannotCallOnceStarted,
'executeRequest'));
}
if (executor._webRequest === null)
{
throw window.parent.Error.invalidOperation(
window.parent.Sys.Res.nullWebRequest);
}
var body = executor._webRequest.get_body();
var headers = executor._webRequest.get_headers();
executor._xmlHttpRequest = new XMLHttpRequest();
executor._xmlHttpRequest.onreadystatechange =
executor._onReadyStateChange;
var verb = executor._webRequest.get_httpVerb();
executor._xmlHttpRequest.open(verb,
executor._webRequest.getResolvedUrl(), true);
if (headers)
{
for (var header in headers)
{
var val = headers[header];
if (typeof(val) !== "function")
executor._xmlHttpRequest.setRequestHeader(header, val);
}
}
if (verb.toLowerCase() === "post")
{
if ((headers === null) || !headers['Content-Type'])
{
executor._xmlHttpRequest.setRequestHeader(
'Content-Type', 'application/x-www-form-urlencoded');
}
if (!body)
{
body = "";
}
}
executor._xmlHttpRequest.send(body);
executor._started = true;
}
</script>
</head>
<body>
</body>
</html>
本文出自 “赵��” 博客,转载请与作者联系!