详解vue或uni-app的跨域问题解决方案


Posted in Javascript onFebruary 21, 2020

常见解决方案有两种

服务器端解决方案

服务器告诉浏览器:你允许我跨域

具体如何告诉浏览器,请看:

// 告诉浏览器,只允许 http://bb.aaa.com:9000 这个源请求服务器
$response->header('Access-Control-Allow-Origin', 'http://bb.aaa.com:9000');
// 告诉浏览器,请求头里只允许有这些内容
$response->header('Access-Control-Allow-Headers', 'Authorization, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, X-Requested-By, If-Modified-Since, X-File-Name, X-File-Type, Cache-Control, Origin');
// 告诉浏览器,只允许暴露'Authorization, authenticated'这两个字段
$response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
// 告诉浏览器,只允许GET, POST, PATCH, PUT, OPTIONS方法跨域请求
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
// 预检
$response->header('Access-Control-Max-Age', 3600);

将以上代码写入中间件:

// /app/Http/Middleware/Cors.php
<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Response;
class Cors {

  /**
   * Handle an incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  {
    $response = $next($request);
    // 告诉浏览器,只允许 http://bb.aaa.com:9000 这个源请求服务器
    $response->header('Access-Control-Allow-Origin', 'http://bb.aaa.com:9000');
    // 告诉浏览器,请求头里只允许有这些内容
    $response->header('Access-Control-Allow-Headers', 'Authorization, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, X-Requested-By, If-Modified-Since, X-File-Name, X-File-Type, Cache-Control, Origin');
    // 告诉浏览器,只允许暴露'Authorization, authenticated'这两个字段
    $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
    // 告诉浏览器,只允许GET, POST, PATCH, PUT, OPTIONS方法跨域请求
    $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
    // 预检
    $response->header('Access-Control-Max-Age', 3600);
    return $response;
  }

}

在路由上添加跨域中间件,告诉客户端:服务器允许跨域请求

$api->group(['middleware'=>'cors','prefix'=>'doc'], function ($api) {
  $api->get('userinfo', \App\Http\Controllers\Api\UsersController::class.'@show');
  
})

客户器端解决方案

欺骗浏览器,让浏览器觉得你没有跨域(其实还是跨域了,用的是代理)

在manifest.json里添加如下代码:

// manifest.json
"devServer" : {
  "port" : 9000,
  "disableHostCheck" : true,
  "proxy": {
    "/api/doc": {
      "target": "http://www.baidu.com",
      "changeOrigin": true,
      "secure": false
    },
    "/api2": {
     .....
    }
  },
  
},

参数说明

'/api/doc'

捕获API的标志,如果API中有这"/api/doc"个字符串,那么就开始匹配代理,
比如API请求"/api/doc/userinfo",
会被代理到请求 "http://www.baidu.com/api/doc"
即:将匹配到的"/api/doc"替换成"http://www.baidu.com/api/doc"
客户端浏览器最终请求链接表面是:"http://192.168.0.104:9000/api/doc/userinfo",
实际上是被代理成了:"http://www.baidu.com/api/doc/userinfo"去向服务器请求数据

target

代理的API地址,就是需要跨域的API地址。
地址可以是域名,如:http://www.baidu.com
也可以是IP地址:http://127.0.0.1:9000
如果是域名需要额外添加一个参数changeOrigin: true,否则会代理失败。

pathRewrite

路径重写,也就是说会修改最终请求的API路径。
比如访问的API路径:/api/doc/userinfo,
设置pathRewrite: {'^/api' : ''},后,
最终代理访问的路径:"http://www.baidu.com/doc/userinfo",
将"api"用正则替换成了空字符串,
这个参数的目的是给代理命名后,在访问时把命名删除掉。

changeOrigin

这个参数可以让target参数是域名。

secure

secure: false,不检查安全问题。
设置后,可以接受运行在 HTTPS 上,可以使用无效证书的后端服务器

其他参数配置查看文档
https://webpack.docschina.org/configuration/dev-server/#devserver-proxy

请求封装

uni.docajax = function (url, data = {}, method = "GET") {
 return new Promise((resolve, reject) => {
  var type = 'application/json'
  if (method == "GET") {
   if (data !== {}) {
    var arr = [];
    for (var key in data) {
     arr.push(`${key}=${data[key]}`);
    }
    url += `?${arr.join("&")}`;
   }
   type = 'application/x-www-form-urlencoded'
  }
  var access_token = uni.getStorageSync('access_token')
  console.log('token:',access_token)
  var baseUrl = '/api/doc/'
  uni.request({
   url: baseUrl + url,
   method: 'GET',
   data: data,
   header: {
    'content-type': type,
    'Accept':'application/x..v1+json',
    'Authorization':'Bearer '+access_token,
   },
   success: function (res) {
    if (res.data) {
     resolve(res.data)
    } else {
     console.log("请求失败", res)
     reject(res)
    }
   },
   fail: function (res) {
    console.log("发起请求失败~")
    console.log(res)
   }
  })
 })
}

请求示例:

//获取用户信息
uni.docajax("userinfo",{},'GET')
.then(res => {
  this.nickname = res.nickname
  this.avatar = res.avatar
});

到此这篇关于详解vue或uni-app的跨域问题解决方案的文章就介绍到这了,更多相关vue或uni-app的跨域问题解决方案内容请搜素三水点靠木以前的文章或下面相关文章,希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
动态调用css文件——jquery的应用
Feb 20 Javascript
在浏览器窗口上添加遮罩层的方法
Nov 12 Javascript
JS获得选取checkbox整行数据的方法
Jan 28 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 Javascript
Angularjs实现上传图片预览功能
Sep 01 Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 Javascript
webpack 动态批量加载文件的实现方法
Mar 19 Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 Javascript
Vue.js暴露方法给WebView的使用操作
Sep 07 Javascript
react-native 实现购物车滑动删除效果的示例代码
Jan 15 Javascript
如何基于js判断浏览器版本
Feb 20 #Javascript
微信小程序webSocket的使用方法
Feb 20 #Javascript
Javascript Worker子线程代码实例
Feb 20 #Javascript
vue中音频wavesurfer.js的使用方法
Feb 20 #Vue.js
Javascript原生ajax请求代码实例
Feb 20 #Javascript
webpack中的模式(mode)使用详解
Feb 20 #Javascript
jquery向后台提交数组的代码分析
Feb 20 #jQuery
You might like
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
推荐11个实用Python库
2015/01/23 Python
理解Python中的With语句
2015/02/02 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python验证码识别处理实例
2015/12/28 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
什么是设计模式
2012/06/17 面试题
研究生自荐信
2013/10/09 职场文书
大专学生推荐信范文
2013/11/19 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
活动总结怎么写啊
2014/05/07 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Redis 哨兵集群的实现
2021/06/18 Redis
Java异常体系非正常停止和分类
2022/06/14 Java/Android