跨域和同源策略

浏览器在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本。同源策略允许页面从同一个站点加载和执行特定的脚本。浏览器通过对比每一个资源的协议、主机名和端口号来判断资源是否与页面同源。站外其他来源的脚本同页面的交互则被严格限制。跨域资源共享(Cross Origin Resource Sharing,CORS)是一个解决跨域问题的好方法,从而可以使用XHR从不同的源加载数据和资源。幸好,除CORS以外还有几个方法可以用来从外部的数据源将数据加载到应用中。我们将详细介绍其中的两种,第三种只会简要介绍(因为它需要服务器端的额外支持):

JSONP

AngularJS在$http服务中提供了一个JSONP辅助函数。通过$http服务的jsonp方法可以发送请求,如下所示:$http.jsonp("https://api.github.com?callback=JSON_CALLBACK") .success(function(data) {

//数据

});当请求被发送时,AngularJS会在DOM中生成一个如下所示的<script>标签<script src="https://api.github.com?callback=angular.callbacks._0"type="text/javascript"></script>

CORS

CORS规范简单地扩展了标准的XHR对象,以允许JavaScript发送跨域的XHR请求。它会通过预检查(preflight)来确认是否有权限向目标服务器发送请求。

预检查可以让服务器接受或拒绝来自全部服务器、特定服务器或一组服务器的请求。这意味着客户端和服务端应用需要协同工作,才能向客户端或服务器发送数据。

W3C制定CORS规范时对很多细节进行了抽象,并使其对客户端开发者透明,让开发者可以像发送同域请求一样方便地发送跨域请求。

angular.module(‘myApp‘, [])
.config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers
.common[‘X-Requested-With‘];
});

现在可以发送CORS请求了。

$http
.get("https://api.github.com")
.success(function(data) {
// 数据
});
$http
.delete("https://api.github.com/api/users/1")
.success(function(data) {
// 数据
});

服务器代理

实现向所有服务器发送请求的最简单方式是使用服务器端代理。这个服务器和页面处在同一个域中(或者不在同一个域中但支持CORS),做为所有远程资源的代理。

可以简单地通过使用本地服务器来代替客户端向外部资源发送请求,并将响应结果返回给客户端。通过这种方式,老式浏览器不必使用需要发送额外请求的CORS(只有现代浏览器支持CORS)也能发送跨域请求,并且可以在浏览器中采用标准的安全策略。

为了实现服务器端代理,需要架设一个本地服务器来处理我们所有的请求,并负责向第三方发送实际的请求。

时间: 2024-10-13 11:45:34

跨域和同源策略的相关文章

Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源策略的限制. 跨域的情形有非常多,最常见的有Ajax跨域.Socket跨域和Canvas跨域.以下列举一些我们常见的跨域情形下.某些浏览器控制台给出的错误提示: FireFox下的提示: 已阻止交叉源请求:同源策略不同意读取***上的远程资源.能够将资源移动到同样的域名上或者启用 CORS 来解决问

跨域之同源策略 Same-origin policy

同源策略是浏览器中最基本的隔离潜在恶意文件的安全策略,他限制了来自不同源(origin)的文档或脚本之间的相互作用. 何谓同源 在跨域之URL中介绍过一个URL的标准格式如下: 协议类型://服务器地址(必要时需加上端口号)/路径/文件名 对比URL的标准格式,这里的同源就是指: 协议类型相同(protocol) 服务器地址相同(host,也可以叫域名相同) 端口相同(port,一般默认为80) 下面是维基百科上的例子. 假如一个URL为http://www.example.com/dir/pa

关于跨域和同源策略的一点总结

这几天在chrome跑项目的时候遇到了一点问题,如下: 接着通过这个错误,引申出了在这次的问题中所要学习的东西: 1.什么是跨域,什么情况下才会产生跨域呢? 2.针对跨域有什么样子的解决办法? 3.同源策略指的是? 4.针对这次问题是如何产生的? 针对以上的问题,通过结合网上的资料,完成了下面的答案: 1.什么是跨域,什么情况下才会产生跨域呢? 跨域指的是不同域名之间相互访问.例如我的电脑上有两个服务器192.168.0.11和192.168.0.12,如果第一个服务器上的页面要访问第二个服务器

Ajax跨域请求 同源策略与Jsonp

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现.同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个

Django之跨域请求同源策略

同源策略: 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过JSONP或者CORS来实现了. 一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: URL 结果 原因 http://a.xyz.com/dir2/oth

【AD】【组策略】跨域转移组策略&可导入的组策略

跨域转移组策略&可导入的组策略 环境: AD PDC 均为:  Win2012 R2 客户端:Win7 x64 A 域:xifan.com B 域:abc.com 需求: 将A域的数个组策略,直接导入B域,简化B域组策略设置 操作步骤: 打开A域的PDC主机. 进入控制台-组策略管理-组策略对象: 导出图中所示所有组策略. 以"测试用-登陆脚本"为示例: 右击-备份 依次全部备份. 将其复制到B域abc.com的PDC内 新建数个组策略,命名与组策略完全一致. 右击登录脚本 注

浏览器拦截跨域请求处理方法(已阻止跨源请求:同源策略禁止读取远程资源)

原文地址:http://my.oschina.net/lichaoqiang/blog/317823 在浏览器请求中,出现跨域访问资源的问题,我们肯定会遇到.如果跨域请求被阻止,有可能导致css.js .ajax请求.font字体等资源出现无法正常访问的问题.接下来,就介绍下解决同源策略不允许读取远程资源的问题. 今天就谈下远程字体跨域的问题. 直接了当了说,解决此类问题,最直接的方法就是,就是给被请求的服务器,添加HTTP头响应头,这里提供两种添加HTTP头的方法: 第一种,就是在程序中添加H

利用servlet做转发,实现js跨域解决同源问题

做前端开发,避免不了跨域这个问题,跨域具体什么概念,不赘述,博客里太多.简单说下,我们用js发请求,不管post还是get,如果发请求的对象和当前web页面不在同一域名下,浏览器的同源策略会限制发请求,也就是说,如果单独写个HTML,用js发远程请求,是发布出去的,浏览器会认为这是不安全的,js在这里能做的很有限. 网上看了很多文章,小弟愚钝,只用js一直没解决这个问题,jQuery的Ajax据说可以,但是测试后发现不行,也许是浏览器版本的原因.有种方法是jsonp,但是好像需要服务器支持,我对

day 37 ajax跨域 浏览器同源测略

浏览器的同源策略 允许跨域: script img iframe 不允许跨域: ajax 跨域ajax <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>T1</h1> <input ty