JSONP_跨域

什么是同源策略

同源策略是浏览器的安全限制,即非同域的脚本无法互相获取资源。这是为了保护用户隐私,防止恶意行为。
两个URL同协议、同域名、同端口,则表示他们同源。
在非同源情况下:
Cookie,localStrage,IndexedDb
DOM 无法获取
Ajax请求无法发送

什么是跨域?跨域有几种实现形式

跨域:绕过浏览器的同源限制访问其他域名的资源
跨域实现形式:
JSONP
CORS
降域
postMassage

JSONP 的原理是什么

利用script标签可以跨域接受响应的原理。
需要服务端支持,服务端将数据用回调函数包裹起来,发送到页面作为js代码执行函数。
步骤:

  1. 定义数据处理函数_fun
  2. 创建script标签,src的地址执行后端接口,最后加个参数callback=_fun
  3. 服务端在收到请求后,解析参数,计算返还数据,输出 fun(data) 字符串。
  4. fun(data)会放到script标签做为js执行。此时会调用fun函数,将data做为参数。

缺点:
只能发起GET请求
比起AJAX,支持不够全面。无法通过注册一些事件监听函数进行其他处理。
需确定访问的异域服务器不会返回恶意的代码
需注意抵御CSRF漏洞:网站通过JSONP跨域传递用户认证后的敏感信息时,攻击者可以构造恶意的JSONP调用页面,诱导被攻击者访问,以达到截取用户敏感信息的目的。

CORS是什么

在CORS中的请求分为两种:简单请求和复杂请求
** 简单请求: **

  1. 只使用GET,HEAD或者POST。如果使用POST来发送数据到服务器,那么使用HTTP POST请求发送到服务器的数据的Content-Type为以下几种之一:application/x-www-form-urlencoded,multipart/form-data以及text/plain。
  2. 不使用HTTP请求发送定制请求头(例如X-Modified等)
    在简单请求下,我们只需设置Access-Control-Allow-Origin头部即可。

**复杂请求 **

  1. 使用了除GET,HEAD和POST以外的方法。如果使用POST方法发送请求数据时的Content-Type不是application/x-www-form-urlencoded,multipart/form-data或者text/plaint。例如,如果POST请求向服务器使用application/xml或者text/xml向服务器发送请求,那么这个请求就是preflighted的。
  2. 设置了定制请求头的请求(例如,请求使用了例如X-PINGOTHER这样的请求头)
    这类请求在发送正式请求之前会发送一个Preflighted(预请求),Preflighted请求首先通过HTTP OPTIONS方法请求其他域上的资源,以确定发送实际的请求是否安全。这样做,是因为跨站请求可能会对目的站点的数据造成破坏。我们第二次发的请求是一个复杂请求,服务端没有响应options的方法,导致预请求失败,之后的请求也就终止了。

参考:http://www.qdfuns.com/notes/16837/7f24c8d1eb39750897060f0b12fa3855.html

你可能感兴趣的:(JSONP_跨域)