CORS 跨域

1 什么是跨域问题

基于安全考虑,浏览器会限制使用脚本发起任何跨域请求。

所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求。

但在实际运用中,跨域获取数据的需求越来越强烈。

在标准没有出现之前,就出现了很多方法。广为使用的一种就是 JSONP。

1.1 JSONP

虽然浏览器有跨域请求的限制,但是一直以来,页面中的 src 元素链接的数据是可以跨域的:

<script src="http://jquery.com/jquery.js"></script>
<img src="http://yigehenhaodewangzhan.com/meinv.jpg"/>

所以很多人就基于这一漏洞(特性),开发出了一种跨域套路,称为 jsonp。

很简单:

// 定义函数,用来加载跨域(脚本)数据
function loadScript(src) {
const script = document.createElement('script');
script.src = src;
document.body.appendChild(script);
} // 然后,就可以使用上述函数,从任何服务器获取数据了
// 获取的数据被嵌入到页面的 <script>数据</script> 中,然后被当做脚本运行
// 所以,我们可以把数据封装为一段可以运行的脚本,比如:
// foo({'name': '张三', 'age': 22})
// 这样,只要我们在页面中存在 foo 函数,这个函数就会被调用,
// 间接地,我们就可以获取并使用服务器得到的“怪异的数据”了
loadScript('http://另一个网站.com/api'); // 这是页面中存在的 foo 方法
function foo (data) {
console.log(data);
}

另外,jQuery 对这种 jsonp 的方式做了很好的封装,使用起来特别简单:

$.ajax({
method: 'get',
url: 'http://再一个网站.com/api',
dataType: 'jsonp', // 返回的类型
jsonp: 'callback',
jsonpCallback='xxx'
}).done(console.log);

1.2 CORS (Cross Origin Resource Share)

一年一年又一年,过去了很多年,所有人只能忍受跨域的问题,想尽各种办法曲线救国。

终于,等待了很多年之后,跨域的官方标准出现了,他就是 CORS。

它的实现原理很简单:

天王盖地虎,宝塔镇河妖

浏览器说,如果想让我显示跨域请求获取的数据,是可以的,不过要满足我的要求:

  1. 我,浏览器,在用户发送跨域请求的时候,会自动在请求 head 里追加 Origin 字段
  2. 你,服务器,如果允许我访问你的数据,你就在返回的时候在响应 head 里添加 Access-Control-Allow-Origin 字段
  3. 我如果能从你返回的数据里发现 Access-Control-Allow-Origin 并核对正确,就向用户渲染数据,否则。。一概跨域错误!!!

一个成功的跨域请求的发送、响应信息为:

# ---请求---
GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
...
Origin: http://foo.example # ---响应---
HTTP/1.1 200 OK
Content-Type: application/xml
...
Access-Control-Allow-Origin: * # ---数据---
[XML Data]

2 手动解除浏览器跨域限制

 

将谷歌浏览器的跨域限制给去除,只需要在启动的快捷方式里添加参数即可:

--disable-web-security --user-data-dir=d:\xxx

然后,开启浏览器,就会没有跨域限制了。

虽然这样可以很方便进行调试跟开发,但是,用完请关闭。不安全。

 

  

  

CORS (Cross Origin Resources Share) 跨域的更多相关文章

  1. spring 跨域 CORS (Cross Origin Resources Share) 跨域

    Spring提供了三种方式跨域 1.CorsFilter 过滤器 2.<mvc:cors> Bean(全局,推荐使用) 3.@CrossOrigin注解 以上三种方式本质都是用来配置Cor ...

  2. 使用Cors在WebApi中实现跨域请求,请求方式为angular的 $http.jsonp

    使用Cors在WebApi中实现跨域请求 第一步,在webapi项目中安装cors 在Web API配置文件中(Global.asax)进行全局配置: public class WebApiAppli ...

  3. 【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验

    在文章"从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能"中分析了CORS返回空200的问题后,进一 ...

  4. ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  5. 使用Cors后台设置WebAPI接口跨域访问

    昨天根据项目组前端开发工程师反映,在浏览器端无法直接使用ajax访问后台接口获取数据,根据他的反映,我查阅了相关跨域的解决方案: 一:使用jsonP,但是jsonP只能使用GET请求,完全不符合我项目 ...

  6. 无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

    近年来,前后端分离已经成为中大型软件项目开发的最佳实践. 在技术层面,前后端分离指在同一个Web系统中,前端服务器和后端服务器采用不同的技术栈,利用标准的WebAPI完成协同工作.这种前后端分离的&q ...

  7. jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求

    这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...

  8. Node.js 【CORS(cross origin resource sharing) on ExpressJS之笔记】

    app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*" ...

  9. 使用CORS解决flask前端页面跨域问题

    from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route(" ...

随机推荐

  1. overfitting(过度拟合)的概念

    来自:http://blog.csdn.net/fengzhe0411/article/details/7165549 最近几天在看模式识别方面的资料,多次遇到“overfitting”这个概念,最终 ...

  2. angular 下载文件

    后台直接返回文件即可,以wcf为例:读取目录文件返回,或直接生成文件并返回. public Stream GetCodeSn() { return File.OpenRead("e:\\工作 ...

  3. <思考的技术>简记

    1.查看资料及背景,将导出的结论.主张列成一张表:2.把表上的结论.主张根据主题的类似性作分类:3.将同一类型的结论.主张按顺序区分:这个时候,把有因果关系的主张或结论分别放好,原因放在下面,结果放在 ...

  4. C# 开发者审查代码的41条建议

    1. 确保没有任何警告(warnings). 2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了. 3. 去掉所有没有用到的usings.编码过程 ...

  5. Web前端开发工程师常用技术网站整理

    1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...

  6. slf4j和log4j源代码解析以及详解

    备注:下面所有代码以log4j为例 包结构 slf4j-api.jar对外提供api slf4j.log4j12.jar提供适配器 log4j.jar是log4j的jar slf4j初始化 获取ILo ...

  7. mybatis之使用注解

    注解 使用对象 相对应的 XML 描述 @CacheNamespace 类 <cache> 为给定的命名空间(比如类)配置缓存.属性有:implemetation, eviction, f ...

  8. 《Programming iOS 7》读书笔记 - 窗体大小与状态栏

    1.从iOS7开始,状态栏开始变为透明的,根识图占领了整个窗体,包括状态栏后面的20像素高的区域,这种样式无法被改变.iOS6的状态栏是不透明的,窗体的尺寸通常会比屏幕的尺寸要小,可以设置窗体的尺寸为 ...

  9. Node.js从入门到实战ECMAScript6一页纸总结(很大的一页纸)

    一.ES5/ES6和babel ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化,现在的浏览器已经相当于完全实现了这个标准.ECMAScript6,即ES6 ...

  10. c#中表达式的返回值是啥?

    今天在学javascript的时候发现它其中有一个语法是这样的(a="haha).length;这样也能够输出haha这个字符串的长度,然而我在使用c#的时候分行读取txt文本的时候也用这个 ...