一. jsonp实现原理是利用script标签可以获取不同源资源的特点,来达到跨域访问某个资源的目的。具体行为如下:

  1. 创建一个script标签,将请求地址写入它的src属性,将这个script外链插入head标签中;
  2. 声明一个回调函数callback,函数名和请求地址中的一致;
  3. 请求地址的内容是一个以json对象为参数的执行函数callback;
  4. 当script资源载入时,callback开始执行,将json数据输出。
  5. jsonp其实就是json padding,而在json数据外包裹它的那个函数,就是padding。
// 简单的mock jsonp

var mockJsonp = function(url) {
var ele = document.createElement('script');
var head = document.getElementsByTagName('head')[0];
ele.src = url;
head.appendChild(ele);
}
mockJsonp('./index.js');
function callback(data){
console.log(data);
} // index.js callback("name": "xxx", "age": "20");

二. jq中的ajax请求数据格式为jsonp时,会发生以下操作:先构造一个script标签,然后注册一个onload的回调,最后将构造好的script标签insert进去;insert完成之后,会触发onload回调,其中又将前面插入的script标签去掉了。其中的 代码 callback( 200, "success" ) 其实就是触发 ajax 的jsonp成功时的success回调函数,callback函数其实是一个 done 函数。

三. jsonp跨域只能是get请求,jq在封装jsonp跨域时,不论我们指定的是get还是post,他统一换成了get请求。

四. cors(Cross-Origin Resource Sharing)跨域资源共享:

1. 简单请求:请求方式是get、post、head之一,头信息不超过 Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(application/x-www-form-urlencoded、multipart/form-data、text/plain)

  • 发出cors请求,会在头部带上Origin(说明本次请求来自那个源),服务器响应成功会返回Access-Control-Allow-Origin为请求的源或*;
  • 请求时设置withCredentials为true可以带上cookie和证书信息之类的,服务器指定Access-Control-Allow-Credentials为true;
  • 如果要发送cookie,Access-Control-Allow-Origin就不能为*,二必须设置为与请求一致的域名;且Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传。

2 . 非简单请求:不同时满足简单请求的条件

  • 会在正式通信之前,增加一次HTTP查询请求,即“预检”请求;
  • “预检”请求方法是OPTIONS,表示这个请求是用来询问的;头信息里面,关键字段是Origin;还包括Access-Control-Request-Method请求方法,Access-Control-Request-Headers需要额外发送的头信息;
  • 如果检查了请求头信息后允许访问,则会返回Access-Control-Allow-Origin,Access-Control-Allow-Headers(支持的所有头信息字段),Access-Control-Allow-Credentials,Access-Control-Max-Age(本次预检有效期);
  • 通过了“预检”请求,以后就跟简单请求一样了。

四. 其他跨域方式

  1. 修改document.domain,将子域和主域的document.domain设为同一个主域;
  2. window.name,每个页面都对window.name有读写的权限,window.name持久存在在一个窗口载入过的所有页面中;
  3. window.postMessage;
  4. 要在父页面访问iframe内子页面的全局变量:window.frames[id].变量名 或 document.getElementById(id).contentWindow.变量名。
  5. nginx反向代理

jsonp及cors的更多相关文章

  1. JSONP和CORS两种跨域方式的简单介绍和解决方案实例

    随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...

  2. 图片ping、JSONP和CORS跨域

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<由外边距合并到BFC> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临时会话 ...

  3. JSONP和CORS两种跨域方式的优缺点及使用方法原理介绍

    随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...

  4. Django - Jsonp、CORS

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

  5. JSONP、CORS解决跨域问题

    一.为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,对href属性都不拦截. 二.解决跨域问题的两种方式 JSONP CORS 三.JSONP 先 ...

  6. 跨域的问题(jsonp和cors)

    由于浏览器的同源策略,用户想要跨域访问浏览器就会报错,那么就涉及到解决跨域的问题.最近我接触到的解决方法是两个,jsonp和cors. jsonp(json with padding)我们虽然不能直接 ...

  7. 小结ajax中的同源和跨域 jsonp和cors

    网上的同源和跨域一般都比较复杂,最近也稍微总结了一下: 所谓同源,是浏览器的一种安全机制,作用在于保护网页数据的安全,不同源的网页之间不允许cookie dom ajax等行为 同源的条件:1.协议相 ...

  8. 跨域漏洞丨JSONP和CORS跨域资源共享

    进入正文之前,我们先来解决个小问题,什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 跨域常见的两种方式,分别是JSONP和CORS. 今天i ...

  9. 跨域方案JSONP与CORS的各自优缺点以及应用场景

    转自 https://www.zhihu.com/question/41992168/answer/217903179 首先明确:JSONP与CORS的使用目的相同,并且都需要服务端和客户端同时支持, ...

  10. 跨域解决之JSONP和CORS的详细介绍

    JSONP跨域和CORS跨域 什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行Jav ...

随机推荐

  1. ELK介绍

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,需要集中化的日志管理,所有服务器上的日志收集汇总. ...

  2. C# Winform 实现Ajax效果自定义按钮

    技术看点 WinForm自定义控件的使用 自定义控件gif动画的播放 需求及效果 又来一波 C# GDI自定义控件show .这个控件已经使用几年了,最近找出来重构一下.原来是没有边框的,那么导致导航 ...

  3. 阿里云轻量应用服务器Lamp部署php工程踩过的坑

    第一次写博客,也不知道写什么,但是想坚持写博客来提升自己,不喜勿喷. 切回正题,使用阿里云的轻量应用服务器Lamp其实非常方便,价格也很便宜,一键购买需要的环境都帮你搭配好了,剩下的就是自己修改一下数 ...

  4. css3的动画特效--元素旋转

    开发中,视觉要你实现一个元素的旋转问题,比如说如下图所示: 思路:首先动画动效肯定离不开anmimation动画. 和transition动画一样,animation动画也是CSS3动画的一种,这类动 ...

  5. 两行 CSS 代码实现 PNG 任意颜色赋色技术

    很久之前在张鑫旭大大的博客看到过一篇 PNG格式小图标的CSS任意颜色赋色技术,当时惊为天人,感慨还可以这样玩,私底下也曾多次想过有没有其他方法可以实现. 本方法与上面 ZXX 的方法及流传的使用 f ...

  6. 五.Spring与RabbitMQ集成--HelloWorld

    spring对RabbitMQ做了很好的集成,我们称之为spring AMQP,其官方文档写得十分详尽,文档地址:https://docs.spring.io/spring-amqp/referenc ...

  7. loadrunner 录制TCP协议脚本操作

    测试TCP协议的项目,涉及到登陆.发送实时数据.指令.登出等,直接写报文工作量太大,所以需要录制报文. 操作方法如下: 1.启动服务端程序 2.使用winsocket协议 3.选择应用程序 4.录制选 ...

  8. 教大家怎样给UITextView加入placeholder扩展

    怎样扩展UITextView以追加placeholder功能呢? 我们的需求是:追加placeholder功能 方案讨论: 通过继承UITextView的方式 通过扩展UITextView的方式 分析 ...

  9. Python: The _imagingft C module is not installed错误的解决

    Python: The _imagingft C module is not installed错误的解决 By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明 ...

  10. Struts2学习笔记整理(三)

    Struts2的输入校验 之前对请求参数的输入校验一般分为两部分:1.客户端校验,也就是我们写js代码去对客户的误操作进行过滤  2.服务端校验, 这是整个应用组织非法数据的最后防线. Struts2 ...