Ajax跨域

618 字
3 分钟
Ajax跨域

同源策略#

同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。 所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

什么是跨域#

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

当前页面url被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html否同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

非同源限制#

  • 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB

  • 无法接触非同源网页的 DOM

  • 无法向非同源地址发送 AJAX 请求

跨域解决方法#

JSONP#

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

核心思想:网页通过添加一个<script>元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

// 处理服务器返回回调函数的数据
<script type="text/javascript">
function dosomething(res){
// 处理获得的数据
console.log(res.data)
}
</script>
// 向服务器127.0.0.1:8000/test发出请求,
该请求的查询字符串有一个callback参数,用来指定回调函数的名字
<script src="http://127.0.0.1:8000/test?callback=dosomething"></script>
// node 部分
app.all('/test',(request, response) => {
// response.send('console.log("hello jsonp")');
const data = {
data: "data"
};
//将数据转化为字符串
let str = JSON.stringify(data)
//返回结果
response.end(`dosomething(${str})`)
// 返回的结果 dosomething({"data":"data"})
})

CORS#

CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法 服务器端对于CORS的支持,主要是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问

// node
app.all('/cors-server', (request, response)=>{
//设置响应头
response.setHeader("Access-Control-Allow-Origin", "*")
// response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500")
response.send('hello CORS');
})

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Ajax跨域
https://sukksa.github.io/posts/ajax-kua-yu/
作者
Sukksa
发布于
2021-12-06
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
原生Ajax
AjaxAjax 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),既是一个对象,也是一种方法模式 AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网…
2
Axios
Ajax1. REST API: restful (Representational State Transfer (资源)表现层状态转化) 1. 发送请求进行CRUD 哪个操作由请求方式来决定 2. 同一个请求路径可以进行多个操作 3. 请求方式会用到GET/POST/PUT/DELETE 2. 非RES…
3
Fetch
Ajaxfetch 是一种 HTTP 数据请求的方式,是 XMLHttpRequest 的一种替代方案。fetch 不是 ajax 的进一步封装,而是原生 js。Fetch 函数就是原生 js,没有使用 XMLHttpRequest 对象
4
react-hooks
reactReact 的核心是组件。v16.8 版本之前,组件的标准写法是类(class)。 任何一个组件,可以用类来写,也可以用钩子来写。下面是类的写法。 再来看钩子的写法,也就是函数。 官方推荐使用钩子(函数),而不是类。因为钩子更简洁,代码量少,用起来比较"轻",而类比较"重"。而且,钩子是函数,更符合…
5
关于 cesium 在 micro-app 下无法显示的问题
cesium基座:vite + vue3 子应用:vite + vue3 micro app v1.0.0 rc.29, cesium v1.135 子应用包含一个 cesium map,在基座打开子应用时,cesium 无法显示地图,但是 sence, sky box, model 都能正常显示,唯独地图不显…
随机文章随机推荐
Profile Image of the Author
Sukksa
记录前端学习与日常
公告
博客刚刚上线,内容还在慢慢补齐。欢迎随便逛逛~
分类
标签
最新动态
站点统计
文章
69
分类
16
标签
17
总字数
178,517
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录