ajax 跨域
什么是跨域
简单来说 : 就是网站A去调用B网站的数据
但是Ajax跨域存在一个问题 – 浏览器的同源策略,该策略还会组织ajax跨域的访问.
同源策略(Same origin policy)是一种约定,它是浏览器的一种安全功能
同源: 同协议,同域名,同端口; 不同源则为跨域
1 | http: --> 这是协议 |
解决跨域呢有三种方法:
- 服务器代理
- cors (跨域资源共享)
- jsonp
下面来介绍这三种的用法 —
代理实现ajax跨域 –>使用phpStudy创建
核心思想: php中有一个函数 ==file_get_contents==。 该函数能够获取到其他网站的数据。
file_get_contents(‘http://www.baidu.com/index.html');
案例:
1 | 发送ajax请求 : |
cors 实现跨域
cors: 跨域资源共享。
同源策略是浏览器的策略。但是如果服务器允许其他网站的页面进行跨域访问,那么浏览器就不会对返回的数据进行限制了。
==核心方法: 在服务器端(PHP文件中)声明不用进行同源限制==
如果设置为 则是所有外部网站都可以获取数据
header(‘Access-Control-Allow-origin: ‘);
只允许www.study.com网站访问并获取数据 ,这样写就可以了,
header(‘Access-Control-Allow-origin: http://www.study.com');
1 | 发送ajax请求 : |
jsonp跨域
JSONP(JSON with Padding) : 是一种解决ajax跨域访问的方案。
核心思想:
浏览器虽然有同源策略,但是 src 和 href 两个属性却可以跨域访问。 可以利用这一“漏洞”发送ajax请求 .
1 | 这是要请求的文件 |
$.ajax方法跨域操作 — jsonp方式
1 | $.post $.get $.ajax都能发送跨域请求。但是,$.post和$.get是要依靠cors方式的,只有$.ajax能使用jsonp方式 |
核心:
必须设置请求类型为get — type: ‘get’
必须设置dataType为jsonp — dataType: ‘jsonp’
必须额外设置一个jsonp参数,该参数值可以是任何英文字符串,常用callback。 jsonp: ‘callback’
==该参数会产生一个随机字符串==
==前端使用该字符串创建一个函数==
==后端接收该字符串作为返回函数的名称==
示例:
1) 使用jsonp发送跨域请求
1 | $.ajax({ |
2) 后端拼接函数字符串
1 | <?php |