1 何为跨域(CORS)?
所謂跨站HTTP請求(Cross-site HTTP request)是指發出請求所在網域不同於請求所指向之網域的HTTP請求,例如網域A (http://domaina.example) 的網頁載入一個<img>元素向網域B(http://domainb.foo) 請求影像資源(http://domainb.foo/image.jpg) 。這種作法在現今各網頁相當常見,網頁常常會載入其他網站資源,像是CSS樣式表、影像、程式碼等等資源。
即基于安全性考虑,在javascript中制定了同源策略(Same Origin Policy)。简单来讲,只有拥有相同的协议(同为http或https) + 端口(port)+ 主机(domain) 才属于同一个源(origin),只有此类才可以进行资源的交互。
________________________________________
2 外网跨域
针对外网的跨域,即在本地(localhost) / 你的站点 中,想获取外部的数据,一般为其他的开放API。如google map api,但此时的数据与 你的站点不属于同源,当进行请求时,浏览器则会提示across origin error。
随着html5的诞生,W3C也开始考虑对跨域的请求方式进行规范。
解决方法:
1. XMLHttpRequest Level 2(简称XHR) —— 新版本的http(s)通信方式
由于老版本XHR收到同源策略限制,只能向同一域名的服务器请求数据。
因此新版本,针对老版本的缺点,做了改进,支持 跨域请求。
但前提是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"(Access-Control-Allow-Origin设置)。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。
2. var xhr = new XMLHttpRequest();
3. xhr.open('GET', 'http://maps.googleapis.com/maps/api/distancematrix/json');
4. xhr.onload = function(e) {
5. var data = JSON.parse(this.response);
6. ...
7. }
xhr.send();
新版XHR中,新增了xhr.responseType,xhr.response属性,可以告诉浏览器,请求后返回什么格式的数据,使我们可以更方便的抓取二进制blob形式的文件。详情可参考XMLHttpRequest2 新技巧。
8. JSONP —— 新型的简单的解决方法
JSONP可以克服 XMLHttpRequest 的同源限制,简单的获取到不同源的数据。
原理很简单,就是script标签 + callback 。(因为 script 并不受同源限制的影响)
script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data";
执行过后,将会得到下面的数据:
<script>{['some string 1', 'some data', 'whatever data']}</script>
但是这种形式,有些不方便抓取到里面的数组,因此改进如下:
script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data?callback=my_callback";
注意到了吗,我们添加了一个 my_callback 函数。因此,当服务器接受到你的请求时,会找到该callback参数,并相应生成下面的形式:
my_callback({['some string 1', 'some data', 'whatever data']});
这样的有利之处在于,我们所获取的数据会自动回调到 my_callback中。
原生javascript用法:
<html> <head> </head> <body> <div id = 'twitterFeed'></div> <script> function myCallback(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>' }
document.getElementById('twitterFeed').innerHTML = text;
}
</script> <script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script> </body></html>
jquery用法:
<html> <head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> <script> $(document).ready(function(){
$.ajax({
url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
dataType: 'jsonp',
success: function(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>' }
$('#twitterFeed').html(text);
}
});
})
</script> </head> <body> <div id = 'twitterFeed'></div> </body></html>
1. 利用Chrome 插件解决跨域 —— 无需借助服务器声明,无障碍跨域
如果我不想这么麻烦,我只想批量抓取外网的一些数据结果,是否有简单的方法呢?
当然,目前Chrome扩展中为了方便插件获取不同域的数据,提供了解决方法。
即只需在manifest.json文件中的"permission"中声明,再用xmlhttpRequest即可。详情可参考Chrome扩展开发手册
{
"name": "My extension",
...
"permissions": [
http://www.google.com/ ],
...
}
________________________________________
3 本地跨域
有时,我们在本地运行页面时,也会遇到across origin error的情况。
这个是因为浏览器的限制。 目前chrome、firfox、opera都出现了这种情况,因为有安全沙箱,它们认为加载本地其它文件为跨域访问(但是使用IE8就不会出现这种错误)。
为了解决该问题,解决方法有两种:
1. 设置Chrome启动参数
在启动Chrome时,添加一个参数:--allow-file-access-from-files
每次启动Chrome都使用该快捷方式,即可解决本地跨域问题
2. 启动Apache设置虚拟主机
Apache中含有虚拟主机的功能,即可以将不同路径下的资源(file://d:/projectA ; file://c:/projectB),设置成同源(localhost/projectA; localhost/projectB),这样引用时,由于都处在 localhost下,因此不会出现跨域问题。
#设置虚拟主机与虚拟目录
#配置文件 Apache安装目录 \conf\extra\httpd-vhosts.conf <VirtualHost *:80> UseCanonicalName Off ServerName localhost
DocumentRoot "D:/projectA"
<Directory "D:/projectB"> Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all </Directory> </VirtualHost> Alias /projectA "D:/projectA" Alias /projectB "C:/projectB"
详细配置可参考Apache VirtualHost配置
参考
[1] XMLHttpRequest2 新技巧
[2] Chrome扩展开发手册
[3] 解决Chrome跨域的方法
[4] JavaScript的同源策略
[5] XMLHttpRequest Level 2 使用指南
分享到:
相关推荐
1. 创建一个包含MVC项目(Web)和Web API项目(WebApiCORS)的解决方案。 2. 在MVC项目中,如Home控制器的Index视图,使用Ajax向WebApiCORS发起跨域请求。 3. 在WebApiCORS项目中,创建一个如ChargingController的...
为了节约成本,很多时候一台server 的nginx可能要部署多个前端的情况,本实例是在docker环境下部署两个前端,同时处理前端调用后端跨域问题,本示例为阿里云centos7 系统docker20.10.6环境下nginx1.19.5版本 ...
4. 学习跨域的基本原理和解决方案,如CORS、JSONP等。 5. 实践项目,通过创建一个简单的Web应用,实现跨域获取和展示JSON数据。 在实践中,可以参考压缩包中的"Web"文件,这是一个适合新手的项目,通过这个项目,你...
前端跨域解决方案,jsonp和cros两种解决方式。我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如[removed]、、<iframe>。那就是说如果要跨域访问数据,...
在IT行业中,尤其是在Web开发领域,跨域问题是一个常见的挑战,尤其当涉及到GIS(地理信息系统)服务时,如Geoserver。Geoserver是一个开源的、基于Java的服务器,用于发布和管理地理空间数据。当从一个源(如浏览器...
跨域,是Web前端开发中经常遇到的一个挑战,它源自浏览器的安全策略——同源策略。同源策略规定,只有当页面与请求资源的域名、协议和端口完全一致时,浏览器才会允许JavaScript进行交互。以下是八种解决跨域问题的...
在本文中,我们将深入探讨如何使用C#和Web API实现最简单且实用的跨域解决方案。 首先,我们需要理解什么是CORS(Cross-Origin Resource Sharing,跨源资源共享)。CORS是一种机制,通过添加额外的HTTP头部,让...
### Ajax跨域问题及其解决...总之,跨域问题是Web开发中常见的问题,解决这一问题的方法多样,但在选择解决方案时应考虑其适用性和安全性。CORS是最推荐的方法,因为它既符合现代Web标准,又能较好地平衡功能与安全性。
总的来说,jQuery通过JSONP提供了一种简单易用的跨域解决方案,使得前端开发人员能够方便地从不同域名的服务器获取数据,丰富了Web应用的功能。然而,由于JSONP的本质是脚本注入,它可能会带来安全风险,如XSS攻击,...
"ASP.NET WebAPI 跨域调用问题的解决方法" 本文主要讲述了 ASP.NET WebAPI 跨域调用问题的解决方法。在开发一个项目中,前端使用 VUE,后端使用 WebAPI,业务包括实体的增删改查。在项目开始时,预计到跨域的问题,...
为了解决这个问题,浏览器提供了几种跨域解决方案: 1. JSONP(JSON with Padding):通过动态创建`<script>`标签,利用其不受同源策略限制的特点,实现跨域获取数据。但是,JSONP只支持GET请求,且没有错误处理...
总结起来,SignalR 跨域问题的解决方案主要依赖于 CORS 配置,同时可以结合其他技术如 JSONP、代理服务器、IFrame 和 PostMessage,以及 WebSocket 协议,根据实际项目需求选择合适的解决方案。正确配置后,SignalR ...
Nginx 跨域问题解决方案 Nginx 是一个流行的开源 Web 服务器软件,广泛应用于 Web 服务器管理。然而,在使用 Nginx 进行服务器管理时,经常会遇到跨域问题。跨域问题是指在不同的域名、端口或协议下,无法访问...
Tomcat跨域解决方案通常涉及添加CORS过滤器。CORS Filter是一个可以处理HTTP响应头,以允许跨域请求的组件。下载并导入`CORS.jar`到Tomcat的`lib`目录。 2. **配置web.xml**: 打开`conf/web.xml`文件,添加以下...
解决跨域问题有多种方法,以下是一些常见的解决方案: 1. JSONP (JSON with Padding): JSONP是一种早期的跨域解决方案,它利用`<script>`标签不受同源策略限制的特点。服务器返回一个JavaScript函数调用,其中包含...
4. JSONP(JSON with Padding):这是一种早期的跨域解决方案,适用于只支持GET请求的API。它通过动态创建`<script>`标签来实现跨域请求。然而,JSONP不提供安全性,只适用于简单请求,且不支持HTTP的其他方法和头。...
**Ajax跨域访问解决方案** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提升用户体验。然而,由于浏览器的同源策略限制,Ajax请求只能向同源(协议、域名和端口相同)...
跨域通信解决方案的课程旨在深入讲解这一领域的核心概念和技术,以便开发者能够理解和解决实际开发中遇到的问题。 首先,我们要理解"跨域"的基本含义。在Web浏览器的安全模型中,同源策略(Same-origin policy)是...