JSONP|JSONP 跨域
一、什么是同源策略?
同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。非同一个源的定义:
- 不同协议,https 和 http,如 https://www.baidu.com 和 http://www.baidu.com
- 不同端口,如 http://127.0.0.1:8080 和 http://127.0.0.1:8090
- 不同域名,如 a.com 和 b.com
二、什么是跨域?跨域有几种实现形式? 跨域就是不同源的资源之间的交互。正是因为同源策略,才会出现跨域这种问题。跨域的实现方式有:
- JSONP
- CORS
- 降域
- postMessage
- 定义数据处理函数 _fun
- 创建 script 标签,src 的地址执行后端接口,最后加个参数 callback = _fun
- 服务端在收到请求后,解析参数,计算返还数据,输出 fun(data) 字符串。
- fun(data) 会放到 script 标签做为 js 执行。此时会调用 fun 函数,将 data 做为参数。
Access-Control-Allow-Origin
属性,允许相应的源地址访问来实现。五、演示三种以上跨域的解决方式 1. JSONP
通过 node + express 来搭建本地服务器,实现 JSONP 效果。 JS 代码:
JSONP 演示 - 锐客网
数据展示
服务端代码
const express = require('express')
const Mock = require('mockjs')
const router = express.Router()router.use('/', (req, res, next) => {
console.log('jsonp')
next()
})router.get('/', (req, res, next) => {
const data = https://www.it610.com/article/Mock.mock({'list|1-10': [{
'id|+1': 1,
'name|1-3': '@FIRST'
}]
})
const callback = req.query.callback
const resData = https://www.it610.com/article/`${callback}(${JSON.stringify(data)})`
res.end(resData)
})module.exports = router
实际演示
可以看到这请求和相应不是同源的,因为端口不同。
文章图片
JSONP 演示 2.CORS
客户端代码
CORS 演示 - 锐客网
数据展示
服务端代码
const express = require('express')
const router = express.Router()
const Mock = require('mockjs')router.use('/', (req, res, next) => {
console.log('cors')res.append('access-control-allow-origin', 'http://127.0.0.1:8090')
// res.append('withCredentials', true)
next()
})router.get('/', (req, res, next) => {
const data = https://www.it610.com/article/Mock.mock({'list|1-10': [{
'id|+1': 1,
'name|1-3': '@FIRST'
}]
})
res.json(data)
})module.exports = router
实际演示
文章图片
CORS 演示 3. 降域
假设现在我有两个域名 a.sub.com 和 b.sub.com,但实际上指向的是同一个 ip 地址和 端口,尽管如此,因为域名不同,依旧是非同源,为了解决这个问题,通过
window.domain
来降域,解决跨域问题。修改 hosts 文件
文章图片
修改 hosts 两个 html 文件,里边使用 iframe 演示。
网站 a - 锐客网 iframe {
background-color: #eee;
}
使用降域实现跨域
网站 b.com - 锐客网
这是网站 b
在未使用
window.domain
降域之前,在网站 a 里是无法访问网站 b 的节点的,如下:文章图片
为降域,获取节点失败
而加上之后:
文章图片
降域成功演示
【JSONP|JSONP 跨域】全部代码地址 | GitHub
推荐阅读
- 一个人的旅行,三亚
- 一个小故事,我的思考。
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 开学第一天(下)
- 一个人的碎碎念
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 遇到一哭二闹三打滚的孩子,怎么办┃山伯教育
- 第326天
- Y房东的后半生14
- 奔向你的城市