frontend:

first :add $.support.cors=true; in front of the Ajax code.

seconde: add the crossDomain:true, attribute to the $.ajax.

webconfig:

add the following code to the node  <system.webServer>

<httpProtocol>
  <customHeaders>
    <add name="access-control-allow-headers" value="accept, origin, token,content-type" />
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Methods" value="OPTIONS, GET, POST" />
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>

Note:

http->http

https->https

/*
* Copyright (C) 2011 Ovea <dev@ovea.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* https://gist.github.com/1114981
*
* By default, support transferring session cookie with XDomainRequest for IE. The cookie value is by default 'jsessionid'
*
* You can change the session cookie value like this, before including this script:
*
* window.XDR_SESSION_COOKIE_NAME = 'ID';
*
* Or if you want to disable cookie session support:
*
* window.XDR_SESSION_COOKIE_NAME = null;
*
* If you need to convert other cookies as headers:
*
* window.XDR_COOKIE_HEADERS = ['PHP_SESSION'];
*
* To DEBUG:
*
* window.XDR_DEBUG = true;
*
* To pass some headers:
*
* window.XDR_HEADERS = ['Content-Type', 'Accept']
*
*/
(function ($) { if (!('__jquery_xdomain__' in $)
&& /msie/.test(navigator.userAgent.toLowerCase()) // must be IE
&& 'XDomainRequest' in window // and support XDomainRequest (IE8+)
&& !(window.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest()) // and must not support CORS (IE10+)
&& document.location.href.indexOf("file:///") == -1) { // and must not be local $['__jquery_xdomain__'] = $.support.cors = true; var urlMatcher = /^(((([^:\/#\?]+:)?(?:\/\/((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?]+)(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
oldxhr = $.ajaxSettings.xhr,
sessionCookie = 'XDR_SESSION_COOKIE_NAME' in window ? window['XDR_SESSION_COOKIE_NAME'] : "jsessionid",
cookies = 'XDR_COOKIE_HEADERS' in window ? window['XDR_COOKIE_HEADERS'] : [],
headers = 'XDR_HEADERS' in window ? window['XDR_HEADERS'] : ['Content-Type', 'Token'],
ReadyState = { UNSENT: 0, OPENED: 1, LOADING: 3, DONE: 4 },
debug = window['XDR_DEBUG'] && 'console' in window,
XDomainRequestAdapter,
domain,
reqId = 0; function forEachCookie(names, fn) {
if (typeof names == 'string') {
names = [names];
}
var i, cookie;
for (i = 0; i < names.length; i++) {
cookie = new RegExp('(?:^|; )' + names[i] + '=([^;]*)', 'i').exec(document.cookie);
cookie = cookie && cookie[1];
if (cookie) {
fn.call(null, names[i], cookie);
}
}
} function parseResponse(str) {
// str === [data][header]~status~hlen~
// min: ~0~0~
if (str.length >= 5) {
// return[0] = status
// return[1] = data
// return[2] = header
var sub = str.substring(str.length <= 20 ? 0 : str.length - 20),
i = sub.length - 1,
end, hl, st;
if (sub.charAt(i) === '~') {
for (end = i--; i >= 0 && sub.charAt(i) !== '~'; i--);
hl = parseInt(sub.substring(i + 1, end));
if (!isNaN(hl) && hl >= 0 && i >= 2 && sub.charAt(i) === '~') {
for (end = i--; i >= 0 && sub.charAt(i) !== '~'; i--);
st = parseInt(sub.substring(i + 1, end));
if (!isNaN(st) && i >= 0 && sub.charAt(i) === '~') {
end = str.length - hl - sub.length + i;
return [st, str.substring(0, end), str.substr(end, hl)];
}
}
}
}
return [200, str, ''];
} function parseUrl(url) {
if (typeof (url) === "object") {
return url;
}
var matches = urlMatcher.exec(url);
return matches ? {
href: matches[0] || "",
hrefNoHash: matches[1] || "",
hrefNoSearch: matches[2] || "",
domain: matches[3] || "",
protocol: matches[4] || "",
authority: matches[5] || "",
username: matches[7] || "",
password: matches[8] || "",
host: matches[9] || "",
hostname: matches[10] || "",
port: matches[11] || "",
pathname: matches[12] || "",
directory: matches[13] || "",
filename: matches[14] || "",
search: matches[15] || "",
hash: matches[16] || ""
} : {};
} function parseCookies(header) {
if (header.length == 0) {
return [];
}
var cooks = [], i = 0, start = 0, end, dom;
do {
end = header.indexOf(',', start);
cooks[i] = (cooks[i] || '') + header.substring(start, end == -1 ? header.length : end);
start = end + 1;
if (cooks[i].indexOf('Expires=') == -1 || cooks[i].indexOf(',') != -1) {
i++;
} else {
cooks[i] += ',';
}
} while (end > 0);
for (i = 0; i < cooks.length; i++) {
dom = cooks[i].indexOf('Domain=');
if (dom != -1) {
cooks[i] = cooks[i].substring(0, dom) + cooks[i].substring(cooks[i].indexOf(';', dom) + 1);
}
}
return cooks;
} domain = parseUrl(document.location.href).domain;
XDomainRequestAdapter = function () {
var self = this,
_xdr = new XDomainRequest(),
_mime,
_reqHeaders = [],
_method,
_url,
_id = reqId++,
_setState = function (state) {
self.readyState = state;
if (typeof self.onreadystatechange === 'function') {
self.onreadystatechange.call(self);
}
},
_done = function (state, code) {
if (!self.responseText) {
self.responseText = '';
}
if (debug) {
console.log('[XDR-' + _id + '] request end with state ' + state + ' and code ' + code + ' and data length ' + self.responseText.length);
}
self.status = code;
if (!self.responseType) {
_mime = _mime || _xdr.contentType;
if (_mime.match(/\/json/)) {
self.responseType = 'json';
self.response = self.responseText;
} else if (_mime.match(/\/xml/)) {
self.responseType = 'document';
var $error, dom = new ActiveXObject('Microsoft.XMLDOM');
dom.async = false;
dom.loadXML(self.responseText);
self.responseXML = self.response = dom;
if ($(dom).children('error').length != 0) {
$error = $(dom).find('error');
self.status = parseInt($error.attr('response_code'));
}
} else {
self.responseType = 'text';
self.response = self.responseText;
}
}
_setState(state);
// clean memory
_xdr = null;
_reqHeaders = null;
_url = null;
};
_xdr.onprogress = function () {
_setState(ReadyState.LOADING);
};
_xdr.ontimeout = function () {
_done(ReadyState.DONE, 408);
};
_xdr.onerror = function () {
_done(ReadyState.DONE, 500);
};
_xdr.onload = function () {
// check if we are using a filter which modify the response
var cooks, i, resp = parseResponse(_xdr.responseText || '');
if (debug) {
console.log('[XDR-' + reqId + '] parsing cookies for header ' + resp[2]);
}
cooks = parseCookies(resp[2]);
self.responseText = resp[1] || '';
if (debug) {
console.log('[XDR-' + _id + '] raw data:\n' + _xdr.responseText + '\n parsed response: status=' + resp[0] + ', header=' + resp[2] + ', data=\n' + resp[1]);
}
for (i = 0; i < cooks.length; i++) {
if (debug) {
console.log('[XDR-' + _id + '] installing cookie ' + cooks[i]);
}
document.cookie = cooks[i] + ";Domain=" + document.domain;
}
_done(ReadyState.DONE, resp[0]);
resp = null;
};
this.readyState = ReadyState.UNSENT;
this.status = 0;
this.statusText = '';
this.responseType = '';
this.timeout = 0;
this.withCredentials = false;
this.overrideMimeType = function (mime) {
_mime = mime;
};
this.abort = function () {
_xdr.abort();
};
this.setRequestHeader = function (k, v) {
if ($.inArray(k, headers) >= 0) {
_reqHeaders.push({ k: k, v: v });
}
};
this.open = function (m, u) {
_url = u;
_method = m;
_setState(ReadyState.OPENED);
};
this.send = function (data) {
_xdr.timeout = this.timeout;
if (sessionCookie || cookies || _reqHeaders.length) {
var h, addParam = function (name, value) {
var q = _url.indexOf('?');
_url += (q == -1 ? '?' : '&') + name + '=' + encodeURIComponent(value);
if (debug) {
console.log('[XDR-' + _id + '] added parameter ' + name + "=" + value + " => " + _url);
}
};
for (h = 0; h < _reqHeaders.length; h++) {
addParam(_reqHeaders[h].k, _reqHeaders[h].v);
}
forEachCookie(sessionCookie, function (name, value) {
var q = _url.indexOf('?');
if (q == -1) {
_url += ';' + name + '=' + value;
} else {
_url = _url.substring(0, q) + ';' + name + '=' + value + _url.substring(q);
}
if (debug) {
console.log('[XDR-' + _id + '] added cookie ' + _url);
}
});
forEachCookie(cookies, addParam);
addParam('_xdr', '' + _id);
addParam('Referer', window.location.href);
}
if (debug) {
console.log('[XDR-' + _id + '] opening ' + _url);
}
_xdr.open(_method, _url);
if (debug) {
console.log('[XDR-' + _id + '] send, timeout=' + _xdr.timeout);
}
_xdr.send(data);
};
this.getAllResponseHeaders = function () {
return '';
};
this.getResponseHeader = function () {
return null;
}
}; $.ajaxSettings.xhr = function () {
var target = parseUrl(this.url).domain;
if (target === "" || target === domain) {
return oldxhr.call($.ajaxSettings);
} else {
try {
return new XDomainRequestAdapter();
} catch (e) {
}
}
}; }
})
(jQuery);

JQuery Cross Domain的更多相关文章

  1. JQuery Cross Domain Ajax(jsonp)

    http://www.pureexample.com/jquery/cross-domain-ajax.html http://www.pureexample.com/ExampleTesterII- ...

  2. 关于ajax跨域请求(cross Domain)

    Cross Domain AJAX主要就是A.com网站的页面发出一个XMLHttpRequest,这个Request的url是B.com,这样的请求是被禁止的,浏览器处于安全考虑不允许进行跨域访问, ...

  3. [cross domain] four approachs to cross domain in javascript

    four approachs can cross domain in javascript 1.jsonp 2.document.domain(only in frame and they have ...

  4. 前端开发各种cross之cross domain

    作为一个苦逼前端开发工程师,不得不面对各种cross,比如面对五花八门的浏览器我们必须cross browser,面对各种终端,我们必须cross device,在这么多年的前端开发经历中,在不同的域 ...

  5. Ajax cross domain

    xhrFields:{ withCredentials:true}, https://stackoverflow.com/questions/2054316/sending-credentials-w ...

  6. 前后端跨域 _ cross domain

    1. 解决跨域既可以从前端, 也可以从后端. 参考好的网络资源: http://www.cnblogs.com/vajoy/p/4295825.html

  7. NodeJS Cross domain

    跨域问题主要在header上下功夫 首先提供一个w3c的header定义 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 再提供一个网友提 ...

  8. jQuery源码分析系列(35) : Ajax - jsonp的实现与原理

    ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本 json核心就是:允许用户传递一个callba ...

  9. jQuery源码 Ajax模块分析

    写在前面: 先讲讲ajax中的相关函数,然后结合函数功能来具体分析源代码. 相关函数: >>ajax全局事件处理程序 .ajaxStart(handler) 注册一个ajaxStart事件 ...

随机推荐

  1. C# 类的属性

    属性是一个方法或者一对方法.客户端看来是一个字段. 定义属性 public int StudyHours{ //啥不写,默认有get;set; 和后备字段studyHours是private的 get ...

  2. Eclipse中使用自己封装的jar包的过程

    在包名上右键,选择Export"" 经过上面的步骤,成功导出了可运行jar包,下面在另一个自己的工程里引入这个jar包 最终效果如下:可见包已经可以正常使用了!! 运行自己的jar ...

  3. BJFU 1057

    描述 斐波那契额数列,我们都知道.现在qingyezhu想求斐波那契的某项值对2的某次方的结果.你可以帮一下他吗?他好可怜哦!计算了N的N次方次都错了,也挨了ben大哥的N的N次方次的训了.我想你是个 ...

  4. install sublime for linux

    Download Your Free eBooks NOW - 10 Free Linux eBooks for Administrators Python API, that available f ...

  5. 在win 7 vs2013下 web 调试 出现“ iis Express Worker Process 已停止工作”错误

    在win 7 vs2013下 web 调试 出现“ iis Express Worker Process 已停止工作”错误: 如下图:   最终解决方案如下: 用管理员身份运行CMD,输入netsh  ...

  6. 解决”不按住fun键输入的是数字,按着fun键才能输入字母”

    原来联想的“FN+NUMLK“键组合,是进行数字和字符区域的切换的. 如果当前输入的是数字,说明当前处于数字模式,按一次“FN+NUMLK“键组合即可切换到字母模式.这样就能够正常地输入字母了.

  7. [已解决] windows 下 git 免输密码

    在 .git/config 里面加上这句话即 [credential] helper = store 原文地址:http://www.cnblogs.com/gifisan/p/5829578.htm ...

  8. apache 一域名下多个二级域名如何做设置?

    域名最新配置说明官网:http://apache.chinahtml.com/ 目的是在根目录,不同子域名可以访问不同目录下的网站: 第一步:打开 C:\Windows\System32\driver ...

  9. flex垂直居中

    最近遇到一个令我绞尽脑汁的布局 T.T.T.T,分享下.重点--垂直居中. 布局说明:1. 场次为一场比赛 2. 比赛双方是交战的两个队伍 3. 一场比赛可以有多种玩法,所以场的每个玩法的布局的高度都 ...

  10. 。【自学总结 1】------3ds Max 界面

    3ds Max 界面包含4部分(7区域) 4部分:菜单.控制工具.命令面板.窗口区 7区域: 1.标题栏:主要用于显示当前工作文件的名称,可以看到文件存储路径. 2.菜单栏:菜单中的命令如果带有省略号 ...