解决浏览器跨域问题

最近在做项目过程中遇到客户端访问不同域的服务时,IE10以下的版本不会发起http请求(google和火狐内置支持跨域)。

这是为了对跨站点请求伪造攻击采取的安全措施。如果我们需要跨域访问,那该怎么办那?

不用怕IE还是给我们提供了一个解决方法。在IE8以后,它提供了一个XDomainRequest 对象(详细内容请看http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx),它是专门跨站数据获取的对象,它里面有两个比较重要的方法:open、send。

Open是连接服务器,打开跨域请求,而send是发送参数字符串到服务器。

下面是一个利用XDomainRequest 对象跨域访问的js脚本。

transport = function () {

var verb = function () {

var post = "POST";

var get = "GET";

var put = "PUT";

var del = "DELETE";

return {

post: post,

get: get,

put: put,

del: del

};

}();

var executeRequest = function (

method,

url,

data,

doneCallback,

failCallback) {

var isCrossDomainRequest = url.indexOf(‘http://‘) == 0

|| url.indexOf(‘https://‘) == 0;

if (window.XDomainRequest

&& isCrossDomainRequest) {

var xdr = new XDomainRequest();

if (xdr) {

xdr.open(method, url);

xdr.onload = function() {

var result = $.parseJSON(xdr.responseText);

if (result === null

|| typeof(result) === ‘undefined‘) {

result = $.parseJSON(

data.firstChild.textContent);

}

if ($.isFunction(doneCallback)) {

doneCallback(result);

}

};

xdr.onerror = function() {

if ($.isFunction(failCallback)) {

failCallback();

}

};

xdr.onprogress = function() {};

xdr.send(data);

}

return xdr;

} else {

var request = $.ajax({

type: method,

url: url,

data: data,

dataType: "JSON",

contentType: ‘application/json‘

}).done(function (result) {

if($.isFunction(doneCallback)) {

doneCallback(result);

}

}).fail(function (jqXhr, textStatus) {

if($.isFunction(failCallback)) {

failCallback(jqXhr, textStatus);

}

});

return request;

}

};

return {

verb: verb,

executeRequest: executeRequest

};

}();

根据以下方法进行访问:

Get 请求:

transport.executeRequest(

transport.verb.get,

url,

null,//这里是传递参数

function(result) {

//可以在这里操作返回的数据

},

function(jqXhr, textStatus) {

// 请求失败之后可以在这里进行相应操作。

}

Post请求:

transport.executeRequest(

transport.verb.post,

url,

null,//这里是传递参数

function(result) {

//可以在这里操作返回的数据

},

function(jqXhr, textStatus) {

// 请求失败之后可以在这里进行相应操作。

}

但是这个方法在传递参数的时候不能传递对象参数(如:{brbh:1,jlid:2}),只能传递字符串参数(brbh=1&jlid=2)。

还有一种解决方案,就是更改jQuery库的请求方式:

(function (jQuery) {

//创建连接对象,为了向后兼容,仍然使用ajaxSettings

jQuery.ajaxSettings.xdr = function () {

return (window.XDomainRequest ? new window.XDomainRequest() : null);

};

// 确定支持的属性

(function (xdr) {

jQuery.extend(jQuery.support, { iecors: !!xdr });

})(jQuery.ajaxSettings.xdr());

// 如果浏览器支持XDomainRequest,则创建传输

if (jQuery.support.iecors) {

jQuery.ajaxTransport(function (s) {

var callback,

xdr = s.xdr();

return {

send: function (headers, complete) {

xdr.onload = function () {

var headers = { ‘Content-Type‘: xdr.contentType };

complete(200, ‘OK‘, { text: xdr.responseText }, headers);

};

// 自定义字段

if (s.xhrFields) {

xhr.onerror = s.xhrFields.error;

xhr.ontimeout = s.xhrFields.timeout;

}

xdr.open(s.type, s.url);

xdr.send((s.hasContent && s.data) || null);

},

abort: function () {

xdr.abort();

}

};

});

}

})(jQuery);

这种方法比前一种好用,只需在引入jQuery库后,添加该段脚本,就可以使用jQuery.ajax去访问。如:

$.ajax({

type: "get",

contentType: "text/palin",

dataType: "json",

url:”http://www.baidu.com”,

success: function (data) {

alert(data.length);

}

});

我个人在使用过程中没发现与原来的jquery库有冲突。

时间: 2024-12-29 16:05:12

解决浏览器跨域问题的相关文章

解决浏览器跨域限制发送ajax请求

一.什么是浏览器跨域限制?本质是什么? 所谓浏览器跨域限制,其实是为了数据安全的考虑由Netscape提出来限制浏览器跨域访问数据的策略,这是一中约定,正式叫法为浏览器同源策略,目前已经在大多数浏览器中支持. 本质上,所谓浏览器同源策略即:不允许浏览器访问跨域的Cookie,ajax请求跨域接口等.也就是说,凡是访问与自己不在相同域的数据或接口时,浏览器都是不允许的. 最常见的例子:对于前后端完全分离的Web项目,前端页面通过rest接口访问数据时,会出现如下问题: 不允许发送POST请求:在发

解决浏览器跨域的几种方式

1.什么是跨域问题 在页面中使用js访问其他网站的数据时,就会出现跨域问题,比如在网站中使用ajax请求其他网站的天气.快递或者其他数据接口时,以及hybrid app中请求数据,浏览器会提     示一下错误: XMLHttpRequest cannot load http://你请求的域名. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://当前页的域  

通过jsonp解决浏览器跨域问题

一.什么是jsonp 为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了. 二.例子 1.客户端写法 这里借用了前端jquery框架对jsonp的支持 var ajaxUrl = "http://192.168.8.141:9092/project/rest/team/m

Java服务端用CORS方法解决浏览器跨域问题

跨域问题简单来说,就是浏览器访问a.com时,a.com中的javascript,想要访问b.com的资源. 浏览器从安全角度考虑限制了这种行为.所以访问失败了. 解决方案主要有两种: 1.JSONP 2.CORS JSONP JSONP方案是将数据放在服务端的javascript脚本中,请求这个javascript.由于浏览器不限制javascript的跨域访问,因此服务端只要把数据放在这个伪javascript中就可以了.需要服务端定义好存有JSON数据的javascript脚本. CORS

跨域_解决浏览器跨域的方式

这里介绍的是--disable-web-security参数.这个参数可以降低chrome浏览器的安全性,禁用同源策略,利于开发人员本地调试. (1)新建一个chrome快捷方式,右键“属性”,“快捷方式”选项卡里选择“目标”,添加   --disable-web-security(1图) (2)新建一个chrome快捷方式,右键“属性”,“快捷方式”选项卡里选择“目标”,添加  --args --disable-web-security --user-data-dir(2图) 原文地址:htt

webapi 解决ajax跨域请求问题

webapi在配置文件中加入这几句就可以解决浏览器跨域请求调用的问题?为什么呢? <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true" /> <httpProtocol> <customHeaders> &

[Java面试十]浏览器跨域问题.

此块内容参考Ajax文档部分. 主要复习内容: 1.JavaScript核心对象 2.浏览器BOM对象 3.文档对象模型DOM 4.常见事件 5.Ajax编程(web交互2种方式的对比) 6.传统Ajax编程的步骤以及从服务器端返回的数据格式 7.JSON数据格式的转换操作 8.jQuery选择器 9.jQuery的Ajax编程(常见方法) 浏览器跨域问题: json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白

深入浅出JSONP:解决AJAX跨域问题

本文主要讲解了如何去解决AJAX跨域的问题,从跨域的简单原理到JONP实现模式详细的讲解整个解决方案,最后利用jQuery可以很方便的实现JSONP来进行跨域访问. 上周客户新买了服务器,原本在旧的服务器上放着客户的Web主页信息和一个后台程序(asp.net),在客户的主页中有一个动态显示最新消息的处理,这个处理就是通过ajax异步从那个后台程序中取得的.由于又购买了新的服务器,客户想把web主页和那个后台程序分开来,后台程序被部署到了新的服务器上.不过这个项目是我的同事小福同志开发的,也就由

用iframe设置代理解决ajax跨域请求问题

面对ajax跨域请求的问题,想用代理的方式来解决这个跨域问题.在服务器端创建一个静态的代理页面,在客户端用iframe调用这个代理 今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题.于是想用代理的方式来解决这个跨域问题. 什么是跨域?简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 方案:在服务器端创建一个静态的代理页面,在