跨域产生的原因和解决方法(跨域是指什么,因为什么引起的有哪些解决方案web前端知识)

2025-05-28 13:15:01 :0

跨域产生的原因和解决方法(跨域是指什么,因为什么引起的有哪些解决方案web前端知识)

本篇文章给大家谈谈跨域产生的原因和解决方法,以及跨域是指什么,因为什么引起的有哪些解决方案web前端知识对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

跨域是指什么,因为什么引起的有哪些解决方案web前端知识

域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。 有一种简明的说法来解释广域跨域:跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。

解决方案:

1、js向服务器发送请求,然后让服务器去另一个域上获取数据后返回。(用于你无法控制另一个域) 比如php中利用cUrl。
2、放置跨域文件.
3、用JSONP。虽然不能跨域进行通信,但是可以引入跨域的js文件。
先定义一个函数

var returnData;
function getData(obj) {
   returnData = JSON.parse(obj);
}


当我们要向www.baidu.com/s.php请求数据的时候,我们可以引入某个包含返回信息的js文件。
比如: 《script type="text/javascript" src="www.baidu.com/s.php?id=12321" /》
js的内容是getData({json:’格式’});返回时输出 格式是 text/javascript (比如php用header(’Content-type:text/javascript’);来输出)
那么文件加载好后解析js时就会执行这个函数,返回得到的数据就被赋值给了returnData变量
以这样的方式插入到页面中:

var script = document.createElement(’script’);
script.src=’www.baidu.com/s.php?id=12321’;  //传入参数id=12321
body.appendChild(script);

说明跨域产生的原因是什么

跨域请求存在的原因:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容。
跨域的方式
1.前端的方式: possMessage,window.name,document.domain,image.src(得不到数据返回),jsonP(script.src后台不配合得不到数据返回),style.href(得不到数据返回)
一.imge.src,script.src,style.href 不受同源策略的影响可以加载其他域的资源,可以用这个特性,向服务器发送数据。最常用的就是使用image.src 向服务器发送前端的错误信息。image.src 和style.href 是无法获取服务器的数据返回的,script.src 服务器端配合可以得到数据返回。
二possMessage,window.name,document.domain 是两个窗口直接相互传递数据。
(1)possMessage 是HTML5中新增的,使用限制是 必须获得窗口的window 引用。IE8+支持,firefox,chrome,safair,opera支持
(2)window.name ,在一个页面中打开另一个页面时,window.name 是共享的,所以可以通过window.name 来传递数据,window.name的限制大小是2M,这个所有浏览器都支持,且没有什么限制。
3) document.domain 将两个页面的document.domain 设置成相同,document.domain 只能设置成父级域名,既可以访问,使用限制:这顶级域名必须相同
2.纯后端方式: CORS,服务器代理
CORS 是w3c标准的方式,通过在web服务器端设置:响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4 ,firefox3.5,safair4,opera12支持这种方式。
服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。
3.前后端结合:JsonP
script.src 不受同源策略的限制,所以可以动态的创建script标签,将要请求数据的域写在src 中参数中附带回调的方法,服务器端返回回调函数的字符串,并带参数。

开发中为什么会出现跨域问题(不是问什么是跨域

出现跨域问题的原因:
1 web中浏览器设置的相关策略
2 应用程序本身设置的禁止跨域限制
跨域问题出现的阶段:
常出现在web开发中,前端访问不同于前端域的服务器端域
产品上线后,也可能存在跨域问题, 因为当一个产品中的不同模块部署到不同的www地址中

qtwebapp跨域产生的原因和解决方法

网页涉及到加载本地资源。如果网页涉及到加载本地资源(如图片),会出现跨域的问题。Qt的QtWebEngine模块基于Chromium项目,遇到这样的情况也会出现跨域的问题。

如何解决前端跨域问题

可以使用服务器代理或者在后端设置允许跨域。
现在的项目一般是在后端设置允许跨域,前端在带有允许跨域的情况下,可以像没有跨域一样正常访问。
如果前端单独发布到服务器,也可以在服务器是设置代理,使用代理转发请求。

手机APP和web服务端 跨域问题

跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。
在以前,前端和后端混杂在一起, 比如JavaScript直接调用同系统里面的一个Httphandler,就不存在跨域的问题,但是随着现代的这种多种客户端的流行,比如一个应用通常会有Web端,App端,以及WebApp端,各种客户端通常会使用同一套的后台处理逻辑,即API, 前后端分离的开发策略流行起来,前端只关注展现,通常使用JavaScript,后端处理逻辑和数据通常使用WebService来提供json数据。一般的前端页面和后端的WebService API通常部署在不同的服务器或者域名上。这样,通过ajax请求WebService的时候,就会出现同源策略的问题。
需要说明的是,同源策略是JavaScript里面的限制,其他的编程语言,比如在C#,Java或者iOS等其他语言中是可以调用外部的WebService,也就是说,如果开发Native应用,是不存在这个问题的,但是如果开发Web或者Html5如WebApp,通常使用JavaScript ajax对WebService发起请求然后解析返回的值,这样就可能存在跨域的问题。
一般的,很容易想到,将外部的资源搬到同一个域上就能解决同源策略的限制的。即在Web网站上同时开发一个Http服务端页面,所有JavaScript的请求都发到这个页面上来,这个页面在内部使用其他语言去调用外部的WebService。即添加一个代理层。这种方式可以解决问题,但是不够直接和高效。
目前,比较常见的跨域解决方案包括JSONP (JSON with padding)和CORS (Cross-origin resource sharing )。一些解决方案需要客户端和服务端配合如JSOP,一些则只需要服务端配合处理比如CORS。下面分别介绍这两种跨域方案,以及服务端WebService如何支持这两种跨域方案。
JSONP以及WebService的支持
同源策略下,某个服务器是无法获取到服务器以外的数据,但是html里面的img,iframe和script等标签是个例外,这些标签可以通过src属性请求到其他服务器上的数据。而JSONP就是通过script节点src调用跨域的请求。
当我们向服务器提交一个JSONP的请求时,我们给服务传了一个特殊的参数,告诉服务端要对结果特殊处理一下。这样服务端返回的数据就会进行一点包装,客户端就可以处理。
举个例子,服务端和客户端约定要传一个名为callback的参数来使用JSONP功能。比如请求的参数如下:
***隐藏网址***
如果没有后面的callback参数,即不使用JSONP的模式,该服务的返回结果可能是一个单纯的json字符串,比如:
{ foo : ’bar’ }
如果和服务端约定jsonp格式,那么服务端就会处理callback的参数,将返回结果进行一下处理,比如处理成:
mycallback({ foo : ’bar’ })
可以看到,这其实是一个函数调用,比如可以实现在页面定义一个名为mycallback的回调函数:
mycallback = function(data)
{
alert(data.foo);
};
现在,请求的返回值回去触发回调函数,这样就完了了跨域请求。
如果使用ServiceStack创建WebService的话,支持Jsonp方式的调用很简单,只需要在AppHost的Configure函数里面注册一下对响应结果进行过滤处理即可。
/// 《summary》
/// Application specific configuration
/// This method should initialize any IoC resources utilized by your web service classes.
/// 《/summary》
/// 《param name="container"》《/param》
public override void Configure(Container container)
{
ResponseFilters.Add((req, res, dto) =》
{
var func = req.QueryString.Get("callback");
if (!func.isNullOrEmpty())
{
res.AddHeader("Content-Type", ContentType.Html);
res.Write("《script type=’text/javascript’》{0}({1});《/script》"
.FormatWith(func, dto.ToJson()));
res.Close();
}
});
}
JSONP跨域方式比较方便,也支持各种较老的浏览器,但是缺点很明显,他只支持GET的方式提交,不支持其他Post的提交,Get方式对请求的参数长度有限制,在有些情况下可能不满足要求。所以下面就介绍一下CORS的跨域解决方案。
CORS跨域及WebService的支持
先来看一个例子,我们新建一个基本的html页面,在里面编写一个简单的是否支持跨域的小脚本,如下:
***隐藏网址***
《head》
《title》AJAX跨域请求测试《/title》
《/head》
《body》
《input type=’button’ value=’开始测试’ onclick=’crossDomainRequest()’ /》
《div id="content"》《/div》
《script type="text/javascript"》
//《![CDATA[
var xhr = new XMLHttpRequest();
***隐藏网址***
function crossDomainRequest() {
document.getElementById("content").innerHTML = "开始……";
if (xhr) {
xhr.open(’POST’, url, true);
xhr.onreadystatechange = handler;
xhr.send();
} else {
document.getElementById("content").innerHTML = "不能创建 XMLHttpRequest";
}
}
function handler(evtXHR) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var response = xhr.responseText;
document.getElementById("content").innerHTML = "结果:" + response;
} else {
document.getElementById("content").innerHTML = "不允许跨域请求。";
}
}
else {
document.getElementById("content").innerHTML += "《br/》执行状态 readyState:" + xhr.readyState;
}
}
//]]》
《/script》
《/body》
《/html》
***隐藏网址***
那么如果在返回响应头header中注入Access-Control-Allow-Origin,这样浏览器检测到header中的Access-Control-Allow-Origin,则就可以跨域操作了。
同样,如果使用ServcieStack,在很多地方可以支持CORS的跨域方式。最简单的还是在AppHost的Configure函数里面直接写入:
/// 《summary》
/// Application specific configuration
/// This method should initialize any IoC resources utilized by your web service classes.
/// 《/summary》
/// 《param name="container"》《/param》
public override void Configure(Container container)
{
this.AddPlugin(new CorsFeature());
}
这样就可以了,相当于使用默认的CORS配置:
CorsFeature(allowedOrigins:"*",
allowedMethods:"GET, POST, PUT, DELETE, OPTIONS",
allowedHeaders:"Content-Type",
allowCredentials:false);
如果仅仅允许GET和POST的请求支持CORS,则只需要改为:
Plugins.Add(new CorsFeature(allowedMethods: "GET, POST"));
当然也可以在AppHost的Config里面设置全局的CORS,如下:
/// 《summary》
/// Application specific configuration
/// This method should initialize any IoC resources utilized by your web service classes.
/// 《/summary》
/// 《param name="container"》《/param》
public override void Configure(Container container)
{
base.SetConfig(new EndpointHostConfig
{
GlobalResponseHeaders = {
{ "Access-Control-Allow-Origin", "*" },
{ "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
{ "Access-Control-Allow-Headers", "Content-Type" },
},
});
}
现在运行WebService,使用postman或者Chrome调用这个请求,可以看到返回的值头文件中,已经加上了响应头,并且可以正常显示返回结果了:

CORS使用起来简单,不需要客户端的额外处理,而且支持Post的方式提交请求,但是CORS的唯一一个缺点是对客户端的浏览器版本有要求,支持CORS的浏览器机器版本如下:
总结
本文介绍了JavaScript中的跨域基本概念和产生的原因,以及如何解决跨域的两种方法,一种是JSONP 一种是 CORS,在客户端Javascript调用服务端接口的时候,如果需要支持跨域的话,需要服务端支持。JSONP的方式就是服务端对返回的值进行回调函数包装,他的优点是支持众多的浏览器, 缺点是仅支持Get的方式对服务端请求。另一种主流的跨域方案是CORS,他仅需要服务端在返回数据的时候在相应头中加入标识信息。这种方式非常简便。唯一的缺点是需要浏览器的支持,一些较老的浏览器可能不支持CORS特性。
跨域支持是创建WebService时应该考虑的一个功能点,希望本文对您在这边面有所帮助,文中是使用ServiceStack来演示跨域支持的,如果您用的WCF的话,知道跨域原理的前提下,实现跨域应该不难。

参考资料:
***隐藏网址***
***隐藏网址***
***隐藏网址***
***隐藏网址***

以上就是我们为大家找到的有关“跨域产生的原因和解决方法(跨域是指什么,因为什么引起的有哪些解决方案web前端知识)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

跨域产生的原因和解决方法(跨域是指什么,因为什么引起的有哪些解决方案web前端知识)

本文编辑:admin

更多文章:


cisci期刊(美国工程与技术管理杂志是sci吗)

cisci期刊(美国工程与技术管理杂志是sci吗)

本篇文章给大家谈谈cisci期刊,以及美国工程与技术管理杂志是sci吗对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录美国工程与技术管理杂志

2026年6月3日 21:15

网页设计dw代码大全(网页设计DW 怎么添加背景图片代码是多少)

网页设计dw代码大全(网页设计DW 怎么添加背景图片代码是多少)

大家好,关于网页设计dw代码大全很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于网页设计DW 怎么添加背景图片代码是多少的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有

2025年12月4日 03:45

python数组变成列表(如何设置偏移/指向一个列表/数组在Python)

python数组变成列表(如何设置偏移/指向一个列表/数组在Python)

大家好,python数组变成列表相信很多的网友都不是很明白,包括如何设置偏移/指向一个列表/数组在Python也是一样,不过没有关系,接下来就来为大家分享关于python数组变成列表和如何设置偏移/指向一个列表/数组在Python的一些知识

2026年1月10日 00:45

然后单击下一步(如何正确给电脑硬盘分区)

然后单击下一步(如何正确给电脑硬盘分区)

本篇文章给大家谈谈然后单击下一步,以及如何正确给电脑硬盘分区对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录如何正确给电脑硬盘分区X201i自带的WIN7系统如何恢复出厂设置详细步骤打印机的安装步骤如何在cad图中提取坐标参数

2026年5月15日 10:45

ant命令打war包(ant打war包的问题)

ant命令打war包(ant打war包的问题)

大家好,ant命令打war包相信很多的网友都不是很明白,包括ant打war包的问题也是一样,不过没有关系,接下来就来为大家分享关于ant命令打war包和ant打war包的问题的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧

2026年3月24日 20:45

php有框架吗(php模板和框架的区别的区别是什么)

php有框架吗(php模板和框架的区别的区别是什么)

各位老铁们好,相信很多人对php有框架吗都不是特别的了解,因此呢,今天就来为大家分享下关于php有框架吗以及php模板和框架的区别的区别是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录php模板和框架的区别

2025年11月20日 11:15

推荐适合死亡金属的异形电吉他+效果器+音响、价格总共5000左右?大虾们告诉我买电吉他 效果器 还有音箱什么牌子的好啊 价格呢

推荐适合死亡金属的异形电吉他+效果器+音响、价格总共5000左右?大虾们告诉我买电吉他 效果器 还有音箱什么牌子的好啊 价格呢

其实js效果器的问题并不复杂,但是又很多的朋友都不太了解推荐适合死亡金属的异形电吉他+效果器+音响、价格总共5000左右,因此呢,今天小编就来为大家分享js效果器的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录推

2025年7月27日 15:00

tocsv函数作用(pandas csv 存取问题)

tocsv函数作用(pandas csv 存取问题)

大家好,如果您还对tocsv函数作用不太了解,没有关系,今天就由本站为大家分享tocsv函数作用的知识,包括pandas csv 存取问题的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录pandas csv 存取问

2026年7月14日 17:15

计算机考试网页制作怎么做(广东省计算机二级网页制作基础需要学习什么)

计算机考试网页制作怎么做(广东省计算机二级网页制作基础需要学习什么)

这篇文章给大家聊聊关于计算机考试网页制作怎么做,以及广东省计算机二级网页制作基础需要学习什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录广东省计算机二级网页制作基础需要学习什么网页设计考试简答题:网页开放制作包括哪些的基本

2026年1月14日 21:45

java怎么安装ubuntu(如何在Ubuntu Linux上升级Oracle Java 4种方法来在Ubuntu Linux上升级Oracle Java)

java怎么安装ubuntu(如何在Ubuntu Linux上升级Oracle Java 4种方法来在Ubuntu Linux上升级Oracle Java)

本篇文章给大家谈谈java怎么安装ubuntu,以及如何在Ubuntu Linux上升级Oracle Java 4种方法来在Ubuntu Linux上升级Oracle Java对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的

2026年1月26日 05:15

点击网页变成下载html(网页打开变成html下载提示,成空白页面)

点击网页变成下载html(网页打开变成html下载提示,成空白页面)

本篇文章给大家谈谈点击网页变成下载html,以及网页打开变成html下载提示,成空白页面对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录网页打开变成html下载提示,成空白页面请问电脑一打开网页就跳出需要下载HTML DOUM

2025年11月9日 00:30

字符串长度可以用lenngtn吗js(js中 我在一个函数中定义一个变量赋为值空!)

字符串长度可以用lenngtn吗js(js中 我在一个函数中定义一个变量赋为值空!)

大家好,如果您还对字符串长度可以用lenngtn吗js不太了解,没有关系,今天就由本站为大家分享字符串长度可以用lenngtn吗js的知识,包括js中 我在一个函数中定义一个变量赋为值空!的问题都会给大家分析到,还望可以解决大家的问题,下面

2025年7月14日 15:45

yielding to(The country has sold out its principles in yielding to the demands of a small but powerful group.)

yielding to(The country has sold out its principles in yielding to the demands of a small but powerful group.)

大家好,今天小编来为大家解答以下的问题,关于yielding to,The country has sold out its principles in yielding to the demands of a small but powe

2026年5月13日 12:45

mkdir命令考题(linux系统考题求教)

mkdir命令考题(linux系统考题求教)

各位老铁们,大家好,今天由我来为大家分享mkdir命令考题,以及linux系统考题求教的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录linux系统

2026年8月21日 13:45

c++抽象类的作用(简述抽象类的概念及特点)

c++抽象类的作用(简述抽象类的概念及特点)

大家好,今天小编来为大家解答以下的问题,关于c++抽象类的作用,简述抽象类的概念及特点这个很多人还不知道,现在让我们一起来看看吧!本文目录简述抽象类的概念及特点抽象类的作用是什么为什么在c++中引入抽象类C++题目 抽象类不是很了解c++里

2025年9月24日 17:45

kali linux攻击手机(在kali_linux下,怎么在metasploit加入自己写的攻击模块)

kali linux攻击手机(在kali_linux下,怎么在metasploit加入自己写的攻击模块)

大家好,今天小编来为大家解答以下的问题,关于kali linux攻击手机,在kali_linux下,怎么在metasploit加入自己写的攻击模块这个很多人还不知道,现在让我们一起来看看吧!本文目录在kali_linux下,怎么在metas

2025年11月27日 11:15

win10怎么进入bios界面(win10系统bios怎么设置进入)

win10怎么进入bios界面(win10系统bios怎么设置进入)

大家好,关于win10怎么进入bios界面很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于win10系统bios怎么设置进入的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各

2026年1月20日 06:15

artery怎么记忆?i青解释arter是什么意思

artery怎么记忆?i青解释arter是什么意思

“arter”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看artery怎么记忆?i青解释arter是什么意思!本文目录artery怎么记忆i青解释arter是什么意思arter 是艺术家吗为什么我的Maven引入sprin

2026年3月28日 09:30

个人简历封面模板图片(Word如何插入个人简历封面)

个人简历封面模板图片(Word如何插入个人简历封面)

这篇文章给大家聊聊关于个人简历封面模板图片,以及Word如何插入个人简历封面对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录Word如何插入个人简历封面个人简历教育经历怎么写简历包括哪些内容简历封面一般写什么个人信息个人简历图

2026年8月11日 18:15

rpm命令未找到(rpm-qimysql-community-server.86_64: 未找到命令)

rpm命令未找到(rpm-qimysql-community-server.86_64: 未找到命令)

本篇文章给大家谈谈rpm命令未找到,以及rpm-qimysql-community-server.86_64: 未找到命令对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录rpm-qimysql-community-server

2026年5月7日 08:30

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索