及其封装(上)

学习目标

节数 知识点 要求
第一节(原生Ajax封装) 为什么函数封装 了解
封装思路 掌握
封装ajax实现步骤 掌握
第二节(什么是跨域) 同源策略和非同源策略 掌握
跨域产生的原因 掌握
第三节(跨域解决方案) cors资源共享 掌握
后台代理 掌握
jsonp原理以及实现 理解
第四节(跨域实例练习) 跨域获取百度搜索接口数据 掌握
模拟百度搜索 掌握

第一节 原生Ajax封装

1.1 封装函数

把共同的 同样的功能封装成一个函数 ,使用的时候 直接调用函数名就好了

()获取到当前的数据,return


2.2 同源策略

同源策略是由 Netscape 公司提出的一个著名的安全策略,所有支持 JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

2.3 为什么要跨域?

现实工作开发中经常会有跨域的情况,因为公司会有很多项目,也会有很多子域名,各个项目或者网站之间需要相互调用对方的资源,避免不了跨域请求。

本章作业

1.什么是同源策略

2.什么是跨域

第三节 跨域解决方案

1、 通过jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域

3.1 后台代理

浏览器阻止跨域请求,利于后台去访问服务器资源,然后本地访问php后台返回的数据。


php文件:

$res=file_get_contents('http://www.youxiake.com/xxx ');

echo $res;

3.2 iframe跨域

1.)父窗口:(http://www.domain.com/a.html)
 


2.)子窗口:(http://child.domain.com/b.html)
 

3.3 跨域资源共享(CORS)

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置

CORS是一个W3C标准,全称是“跨域资源共享”(Cross-origin resource sharing)。

它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源发送请求的限制。

实现CORS主要在于服务器的设置,关键在于服务器HTTP响应报文首部的设置。前端部分大致还是跟原来发AJAX请求没什么区别,只是需要对AJAX进行一些相关的设置。

CORS的两种请求

浏览器将CORS分为两种请求,一种是简单请求,另外一种对应的肯定就是非简单请求

阮一峰:http://www.ruanyifeng.com/blog/2016/04/cors.html

3.4 porxy代理

原理:让代理服务器请求目标地址,因为请求是在服务端进行的,在服务端不存在跨域,从而解决跨域问题

实现:将原地址绑定在代理服务器下,让代理服务器发送请求。

3.5 jsonp跨域

3.5.1 jsonp跨域的原理

动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返回json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域

【代码演示】


php:

//接收函数变量名

_GET['callback'];

//比如 虚拟数据 创建数组

$arr=array('msg'=>'ok','info'=>'虚拟后台数据');

arr);//数组--字符串对象

// $obj='hello';

echo "obj)";

?>

【代码演示】

 

3.5.2 不受同源限制的情况

当然也有不受同源限制的情况存在,主要有以下列举的:

\1. script标签允许跨域嵌入脚本,稍后介绍的JSONP就是利用这个“漏洞”来实现。

\2. img标签、link标签、@font-face不受跨域影响。

\3. videoaudio嵌入的资源。

\4. iframe载入的任何资源。(不是iframe之间的通信)

\5. 和``的插件。

\6. WebSocket不受同源策略的限制。

本章作业

1.跨域的解决方式有哪几个

2.jsonp解决跨域的原理

第四节 jsonp跨域

4.1 百度jquery跨域请求

【语法】

        $.ajax({
            type: "get",
            async: false,
            url: "http://localhost:8080/getdata.php",
            dataType: "jsonp",
            jsonp: "callback",//传递给请求处理程序或页面的,标识jsonp回调函数名(一般为:callback)
            jsonpCallback: "GetData",//callback的function名称
            success: function (data) {
                console.log(data);
            },
            error: function () {
                alert('fail');
            }
});

语法解析参数:

jsonp
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,
比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。

jsonpCallback
为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。
这主要用来让jQuery生成一个独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理

【百度代码演示】


4.2 jsonp优缺点

4.2.1优点

1.它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制,JSONP可以跨越同源策略
2.它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;   
3.在请求完毕后可以通过调用callback的方式回传结果。
将回调方法的权限给了调用方。这个就相当于将controller层和view层终于分开了。
我提供的jsonp服务只提供纯服务的数据,至于提供服务以 后的页面渲染和后续view操作都由调用者来自己定义就好了。
如果有两个页面需要渲染同一份数据,你们只需要有不同的渲染逻辑就可以了,
逻辑都可以使用同 一个jsonp服务。

4.2.2 缺点

1它只支持GET请求而不支持POST等其它类型的HTTP请求
2它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
 
3 jsonp在调用失败的时候不会返回各种HTTP状态码。
4缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。
那么结果是什么?所有调用这个 jsonp的网站都会存在漏洞。
于是无法把危险控制在一个域名下…所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信的。

你可能感兴趣的:(及其封装(上))