35 跨域相关问题, 以及常见的解决方式

news/2024/7/19 13:04:25 标签: js, domain, http

前言

跨域相关

这是一个 经常会碰到的问题

然后 常见的解决方式 也大概就是几种, 各有各的问题

这里仅仅是 从理论上 来探讨这个问题

主流的解决方式 是通过代理, 将不同域 合并到同一个域

测试用例

测试用例如下, 这里仅仅是一个简单的数据展示

获取对方 “/config.json” 的接口的数据, 然后展示出来

无跨域的情况下直接请求 “/config.json”, 这种情况下 正常展示业务数据

跨域的情况 配置为 其他服务器的 “/config.json” 的请求[这里为 http://172.27.181.126:10080/config.json], 这时候会碰到 跨域的问题

<template>
  <div id="text" >
    <button @click="handleClick" > click </button>
    {{text}}
  </div>
</template>

<script>
import $ from 'jquery'

export default {
  name: "HelloWord",
  components: {
  },
  data() {
    return {
      text: "text"
    }
  },
  methods: {
    mounted() {

    },
    handleClick() {
      var _this = this
      console.log("xx")
      $.get("/config.json", function(data) {
        console.log(data)
        _this.text = data
      })
    }
  }
}
</script>

<style>
</style>

在无跨域的问题下面, 初始化状态如下

https://img-blog.csdnimg.cn/f3af7131cd25421b9cb1e409cd85ab6b.png" width="1200" />

点击按钮之后, 能够正常拿到数据, 并且 正常展示

https://img-blog.csdnimg.cn/4ce455d15da44f82b1cd68c8e62427dd.png" width="1014" />

构造跨域的情况, 更新 url 为 “http://172.27.181.126:10080/config.json” 

发送请求之后 报错如下, 这是一个 典型的跨域异常

https://img-blog.csdnimg.cn/20fba480f8434232bc4240ba7e59e865.png" width="1200" />

访问的这两个不同服务, 不同之处在于 一个里面 from 的值是 node, 一个 from 的值是 nginx

本域的服务如下

https://img-blog.csdnimg.cn/6060e3df9a42468aa14218f47f1829e0.png" width="431" />

第三方域的服务如下

https://img-blog.csdnimg.cn/7550ea8825d34da59f9d603eebd7da93.png" width="546" />

浏览器默认的安全策略配置

Chrome 的启动命令增加如下参数 “--disable-web-security --user-data-dir=D:\ChromeDevData” 

关闭 浏览器的web安全策略

https://img-blog.csdnimg.cn/aaff7ad5a87044b1ac12d15925f0e062.png" width="390" />

然后 实际运行, 效果如下

可以看到 跨域的异常被跳过了

https://img-blog.csdnimg.cn/32c1d782c4904b5e965c2eb943b429f8.png" width="1034" />

对方服务器增加允许跨域的相关响应头配置

这个相当于是 客户端这边和对方服务器沟通之后, 对方服务器告诉客户端这边, 需要允许跨域, 客户端这边才能正常的访问对方服务器的服务

服务器这边增加 允许跨域 的相关配置, 配置信息如下

add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "POST,GET,OPTIONS,DELETE";
add_header Access-Control-Allow-Credentials "true";

https://img-blog.csdnimg.cn/8693fe4d0e6541a7bd936f4bfe6b4861.png" width="610" />

然后 服务器相应数据如下

https://img-blog.csdnimg.cn/99304d62c76e405389c50cd8c5df1da8.png" width="611" />

然后 我们看一下 页面的情况, 可以看到 跨域问题 也没有了

https://img-blog.csdnimg.cn/bf1b7c55040c456a9cd3c946ba91be86.png" width="879" />

基于 jsonp 来解决跨域问题

当然 这个同样需要服务器配合, 或者 增加代理服务器 专门转义这块的 wrap

客户端这边处理如下, 直接基于 jquery 中提供的 $.ajax 中相关配置来实现这个处理

主要是 封装 script 标签, 封装 jsoncallback 函数, script 标签主要是用于获取 对方服务器的信息, 拿到的是 jsoncallbck($response)

主要依据的是 script 标签, 没有 跨域策略的限制

然后 jsoncallback 是 jquery 这边自己根据 success 来进行封装的

https://img-blog.csdnimg.cn/abb835e4cd20454683bf1544350df90f.png" width="556" />

需要调整服务器这边的处理, wrap 一下, 封装 jsonpcallback 的函数封装格式

使其满足 javascript 的语法格式, 然后 客户端拿到这段内容之后, 将其执行, 进而实现 业务处理

https://img-blog.csdnimg.cn/3852fc25568a4802b23512a2fcc9397c.png" width="494" />

基于代理服务, 统一访问的域

比如我们这里有 node 服务作为本地服务, nginx 作为对方服务

从部署到生产环境的角度来看

那么 可以在 nginx 上面增加配置, 组合 node 服务 和 目标静态资源服务, 比如这里 “location /” 是对应于静态资源服务, ”location /HelloWorld” 对应于 node 服务

然后 这时候通过 nginx 来访问 node 的页面, 然后 页面 $ajax 这边访问的 url 更新为 “/config.json”, 这样就不会存在 跨域的问题了

https://img-blog.csdnimg.cn/04b1929121814a2a9210b3d362b78922.png" width="652" />

从另一个角度, 从开发的角度来看, 在 vue 的开发服务器上面配置 相关代理

vue.config.js 中 devServer 的代理配置如下, “/config.json” 代理到 目标服务器上面去

https://img-blog.csdnimg.cn/f9d97269cb4044aeb68f44855f5624fe.png" width="526" />

业务测使用, 直接请求本域的数据服务 即可

https://img-blog.csdnimg.cn/6b78fcf4f94149e39bc92f2af19375ac.png" width="462" />

最终页面效果如下, 从 from 可以判断出 获取的是 对方服务器的数据

这里存在的一个冲突是, 如果 node 上面本身也有 “/config.json” 的服务, 会优先选择 node 上面的 “/config.json” 

https://img-blog.csdnimg.cn/b736afcff4fe496d89ca3775e47d2273.png" width="868" />

chrome 访问对方服务器的时候可能会出现 net::ERR_UNSAFE_PORT

这个是 chrome 这边的一些 安全策略的控制, 发现访问的端口是 某敏感端口, 直接 block 掉请求

浏览器 网络这边的情况如下

https://img-blog.csdnimg.cn/13356abeb0b14cea8ef7ad73486ef244.png" width="1200" />

然后 console 这边报错如下, 错误信息为 ERR_UNSAFE_PORT

https://img-blog.csdnimg.cn/21a7b82e254b4b02a27eb4fcae289921.png" width="1200" />

这种情况下, 在 chrome 的启动快捷方式中增加如下 参数即可 “ --explicitly-allowed-ports=10080” 

https://img-blog.csdnimg.cn/aa1a4cce68b54f688e835b9705d83bbc.png" width="407" />


http://www.niftyadmin.cn/n/5452290.html

相关文章

Linux学习笔记16 - 系统命令

1. Linux 常见系统管理命令 命令含义格式su切换用户su [选项] [用户名]ps显示系统由该用户运行的进程列表ps [选项]top动态显示系统中运行的程序&#xff08;一般为每隔 5s&#xff09;topkill输出特定的信号给指定 PID&#xff08;进程号&#xff09;的进程&#xff0c;并根据…

C++初阶:容器适配器stack与queue

目录 1. stack与queue的使用练习1.1 stack的常用接口&#xff08;栈&#xff09;1.2 queue常用接口&#xff08;队列&#xff09;1.3 priority_queue的常用接口&#xff08;堆&#xff09; 2. 容器适配器2.1 栈的实现2.2 队列的实现3. 堆&#xff08;priority_queue&#xff09…

全面:vue.config.js 的完整配置

vue.config.js是Vue项目的配置文件&#xff0c;用于配置项目的构建、打包和开发环境等。 在Vue CLI 3.0之后&#xff0c;项目的配置文件从原来的build和config目录下的多个配置文件&#xff0c;合并成了一个vue.config.js文件。这个文件可以放在项目的根目录下&#xff0c;用于…

「媒体宣传」财经类媒体邀约资源有哪些?-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 财经类媒体邀约资源包括但不限于以下几类&#xff1a; 商业杂志和报纸&#xff1a;可以邀请如《财经》、《新财富》、《经济观察报》等主流商业杂志和报纸。这些媒体通常具有较强的品牌影…

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

安卓设备使用国内ip代理的优势

在如今数字化高度发达的时代&#xff0c;安卓设备成为人们日常生活中必不可少的工具之一。然而&#xff0c;有时候我们可能需要通过国内IP代理来实现特定的网络访问需求。虎观代理小二将深入探讨在安卓国内IP代理的方法、优势以及注意事项。 1. 国内IP代理在安卓设备上的设置方…

JMeter元件作用域和执行顺序

JMeter元件作用域和执行顺序 元件的基本介绍基本元件总结 作用域的基本介绍作用域的原则元件执行顺序Jmeter第一个案例&#xff1a; Jmeter三个重要组件&#xff08;重点&#xff09;线程组特点线程组分类线程组的属性案例分析 HTTP请求案例一&#xff08;使用HTTP请求路径来传…