1. 前言
因为浏览器的同源策略,导致了前端请求服务器资源出现的跨域问题
2. 跨域问题解决方案
- JQuery的jsonP跨越【需要配置jsonp接口】,get请求可通过
<a> / <img> / <script>标签实现跨域访问 - webpack 或 vue/cli 或 vite 的dev-server设置跨域
- 服务器设置代理跨域,后台跨域返给前端,或者后端做转发,把数据返给前端
- uniapp内置浏览器自带跨域
- 使用谷歌浏览器的跨域插件,或者解除谷歌跨域限制【推荐文章:关于如何设置谷歌浏览器禁止检查ajax跨域问题的解决方案】
- 使用nodeJS启用本地服务器,实现代理转发。跟dev-server类似
3. 方法介绍
- jsonp 跨域
- 什么是跨域?当请求url时,它的协议、域名、端口,任意一个与你当前页面的url不同即为跨域
- 什么是JSONP? JSONP其实是一个跨域解决方案
- JSONP跨域原理 ,
<a> / <img> / <script>等标签的src属性,它不受同源策略的限制;JSONP请求数据时,服务器返回的是一段可执行的javascript代码- JSONP用途:解决请求其他服务器时的跨域问题
- JSONP局限:只能用get方式,需要服务器做一些处理、配合
<button onclick="sendAjax()">发送</button>
<script>
// 处理请求回调函数
function dataFun(res) {
console.log(res);
}
function sendAjax() {
console.log("点击");
let url = "http://localhost:5000/get_data?callback=dataFun";
let _script = document.createElement("script");
console.log('_script',_script)
_script.setAttribute("src", url);
_script.setAttribute("type", "text/javascript");
document.getElementsByTagName("body")[0].appendChild(_script);
}
</script>
- webpack 或 vue/cli 或 vite 的dev-server设置跨域
devServer: {
open: true, // 默认浏览器自动打开
// inline: true, // 开启热更新
// host: '0.0.0.0', // 设置为0.0.0.0则所有的地址均能访问
port: '5000', // 设置本地服务器的端口号
// 需要gzip压缩的文件【谨慎使用】
// before (app, server) {
// app.get(/.*.(js)$/, (req, res, next) => {
// req.url = req.url + '.gz'
// res.set('Content-Encoding', 'gzip')
// next()
// })
// },
proxy: {
'/admin': {
target: baseUrl, // 测试域名
changOrigin: true
},
'/api': {
target: baseUrl, // 测试域名
changOrigin: true
}
}
},
- 服务器设置代理跨域,后台跨域返给前端,或者后端做转发,把数据返给前端
一般情况下,再对接第三方服务的时候,经常用到,如请求微信用户信息,前端获取code后传递给后端,后端拿到code再通过微信开放API获取微信用户信息类似
- uniapp内置浏览器自带跨域
这个就不做过多讲解
- 使用谷歌浏览器的跨域插件,或者解除谷歌跨域限制
Allow-Control-Allow-Origin插件安装参考文章:blog.csdn.net/qcg14774125…
推荐,解除谷歌跨域限制,详细方法如下 【推荐文章:关于如何设置谷歌浏览器禁止检查ajax跨域问题的解决方案】
1、在桌面上先找到原本的chrome启动快捷应用程序exe文件
2、找到该文件的位置
3、创建快捷方式到桌面
4、我们将新创建的快捷方式重新命名为cross-domain
5、将该快捷方式放置文件路径为D:\three\chrome
6、点击右键查看其属性
7、在目标框内输入:
C:\Users\ZGF\AppData\Local\Chromium\Application\chrome.exe --disable-web-security --user-data-dir=D:\three\chrome原本的启动路径:
C:\Users\ZGF\AppData\Local\Chromium\Application\chrome.exe谷歌的跨域命名:
--disable-web-security --user-data-dir=新创建的cross-domain快捷方式的路径 :
D:\three\chrome注意空格
8、打开此浏览器如果出现这个标识,说明成功
- 使用nodeJS启用本地服务器,实现代理转发。跟dev-server类似
参考文档:blog.csdn.net/hs121946241…
大概思路,跟后端做请求代理转发是一样的,这里不做过多讲解。但是值得注意的是,后端标头需要声明允许跨域,或者IP加入白名单之类的