跨域问题一文解决

       📝个人主页:五敷有你      

 🔥系列专栏:Vue

⛺️稳中求进,晒太阳

一、为什么会出现跨域的问题?

        是浏览器的同源策略,跨域也是因为浏览器这个机制引起的,这个机制的存在还是在于安全。

1. 什么是源

Web内容的源由用于访问它的URL 的方案(协议),主机(域名)和端口定义。只有当方案,主机和端口都匹配时,两个对象具有相同的起源。

同源不同源一句话就可以判断:就是url中 scheme host port 都相同即为同源。

下面认识下url 结构中的这三个部分。

2. URL结构

URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。

URL有如下结构组成:

https://cloud.tencent.com/developer:80?from_column=20421&from=20421

  • https: 是 Protocol
  • cloud.tencent.com:也叫做host域名
  • :80 是端口
  • from_column是参数
3. 浏览器为什么需要同源策略

同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。

在没有前后端分离的时候,跨域问题往往是很少的。因为前后端都部署到一起。现在前后端分离不管vue /react 面临跨域请求的问题。

4. 图解:

跨源域资源共享(CORS)机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险。

二、前端解决方案

jsonp

JSONP的原理非常简单,就是HTML标签中,很多带src属性的标签都可以跨域请求内容,比如我们熟悉的img图片标签。同理,script标签也可以,可以利用script标签来执行跨域的javascript代码。通过这些代码,我们就能实现前端跨域请求数据。

jsonp 可以在前端解决跨域问题,但是只是针对于get请求。实现方式可以引用一些npm 第三方库实现,jquery 也是带的。

可以在npm 搜下jsonp 库实现,非常简单。

在这里插入图片描述

webpack-dev-server

前端无论是vue项目还是react 项目大多数都会以webpack-dev-server 来运行,webpack-dev-server 可以设置代理,前端可以在开发环境设置代理解决跨域问题。

 proxy: {'/api': {target: 'http://localhost:3000',pathRewrite: { '^/api': '' },changeOrigin: true,},}

vue-cli、create-react-app、umi 等脚手架找到webpack devserver配置位置配上即可。

注意: 只限在开发环境,生产环境需要web 服务器同样原理代即可。下面会说明怎么用

 

document.domain

利用document.domain 可以修改 访问页面的域,多用在父子关系的域,子域可以设置document.domain等于父域,从而解决同父域跨域问题。

举例子:

www.ios.xingyu.com 访问 www.web.xingyu.com 跨域,可以利用 document.domain 设置成 www.xingyu.com

当Vue项目打包成静态文件时,他的代理也就失灵了,因为代理的前提是本地必须有service,本章讲一下生产环境的Vue项目如何做代理。

三、生产环境解决跨域问题流程如下

(1)打包

我们通过terminal窗口,找到我们项目根目录 运行 npm run build命令
(2)服务器安装nginx服务器
(3)配置nginx

找到nginx的配置文件 nginx.conf ,它的路径是 /etc/nginx/nginx.conf

nginx.conf的配置如下

server {listen       8000;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location /api {proxy_pass https://www.baidu.com;  #代理的域名add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; }location  / {root   /var/www/vue/;index  index.html index.htm;}}


解释如下:

  • https://www.baidu.com 是我们要代理域名
  • add_header 是增加返回头 解决跨域问题

注意:vue项目在请求域名的前面就要加上“/api”字符串,请求示例如下

test.post('/api/product/getData',params)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言指针易混问题

1. 在此函数传参过程中,虽然p是指针,但此处传递等价于值传递而非地址传递,所以函数中对变量的改变不改变主函数中原有变量的值 2. 能修改的是变量,但常量不能被修改,否则会出现段错误,下图为错误示范

机器学习中的激活函数

激活函数存在的意义: 激活函数决定了某个神经元是否被激活,当这个神经元接收到的信息是有用或无用的时候,激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数,神经元仅仅做线性变换,那么该神经网…

产品经理应具备哪些素质呢?

目录 简介 产品经理素质 CSDN学院 作者简介 简介 刚毕业想做产品经理,或者想转行产品经理,该怎么入手呢? 很多人对产品经理有这样一个认知:就是空有一个经理的头衔,却没有任何实质的权利。 其实这是有误区的&am…

AI是什么?

介绍AI AI是一个韵母的发音,发音汉字有爱、哎、唉、艾、😔、埃、矮、挨等。 没了 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 真没了 . . . . . . . . . . . . . . . . . …

日程安排组件DHTMLX Scheduler v7.0新版亮点 - 拥有多种全新的主题

DHTMLX Scheduler是一个类似于Google日历的JavaScript日程安排控件,日历事件通过Ajax动态加载,支持通过拖放功能调整事件日期和时间,事件可以按天、周、月三个种视图显示。 备受关注的DHTMLX Scheduler 7.0版本日前正式发布了,如…

资深大佬养成之路:Java中关于List集合选择与使用(二)

本系列文章简介: 作为一个Java程序员,我们经常会遇到需要处理大量数据的情况。而在处理数据时,我们常常需要使用到集合这种数据结构。而在集合中,List是最常用的一种。 List是一种有序的集合,它可以存储任意类型的对象…

基于react native的原生iOS 微信登录

基于react native的原生iOS 微信登录 引入SDK:WechatOpenSDK-XCFramework.xcframeworkios 创建CustomerWxLogin类CustomerWxLogin.hCustomerWxLogin.m react native端调用创建wxLogin.js用于架起桥梁连接ios原生代码在页面中使用 微信open SDK 引入SDK:W…

Flutter 与Android 原生通信的3种基本方式的使用

一、Flutter 与 原生通信的三种基本方式以及使用场景 1.MethodChannel 主要是用于Flutter调用原生的方法(执行一个原生的行为更合适) 2.BasicMessageChannel 用于Flutter Native双向流式通信 3.EventChannel 主要用于Native平台单独向Flutter发送事件消息流,更强调单向用…

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求: 有这几个就行,门店名称门店地址门店类型,再加上省、市、县/区门店名称:storeName 门店地址:storeAddress 程序运行: honor_spider获取经纬度信息。 经纬度——>详…

「PHP系列」PHP 命名空间详解

文章目录 一、PHP命名空间1. 声明命名空间2. 使用命名空间3. 命名空间的作用范围4. 子命名空间5. 全局命名空间和非命名空间代码6. 命名空间与自动加载 二、PHP命名空间使用1. 基本使用2. 子命名空间3. 全局函数和常量4. 结合自动加载 三、相关链接 一、PHP命名空间 PHP 的命名…

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境,并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店,在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS:Clang这个插件别安装&…

【电路笔记】-逻辑或非门

逻辑或非门 文章目录 逻辑或非门1、概述2、晶体管逻辑或非门3、数字逻辑或非门类型4、通用或非门逻辑或非门是数字逻辑或门与反相器或非门串联的组合。 1、概述 或非(Not-OR)门的输出通常为逻辑电平“1”,并且仅当其任何输入处于逻辑电平“1”时才变为“低”至逻辑电平“0”…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR(Harmony Archive)是静态共享包,可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP,不能独立安装运行在设备上,只能作为应用模块…

力扣HOT100 - 73. 矩阵置零

解题思路: 题目要求使用原地算法 在原地算法中,输入数据通常在内存中直接被修改,而不需要额外的辅助数据结构来存储中间结果。原地算法的一个常见应用是在数组或列表上进行操作,而不是创建新的数组或列表来存储结果。 class So…

bash的login shell与non-login shell,以及各自的初始化过程

识别login shell与non-login shell login shell 可能是以-开头的 [almalinuxVM-AlmaLinux8-tmpl-wanlinwang ~]$ echo $0 -bash # "-" is the first character. Therefore, this is a login shell.或者以--login启动的bash [almalinuxVM-AlmaLinux8-tmpl-wanlinw…

Python自动打开Excel文件

导入必要的模块 import os import subprocess编写打开文件的函数 def open_file(file_path):"""打开指定路径下的文件。参数:file_path (str): 文件的路径。"""if os.name "nt": # 如果是 Windows 系统os.startfile(fi…

js面试---数据类型

1、js有哪些数据类型?有什么区别 js一共有Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt,八种数据类型。 Symbol:ES6新增数据类型,代表创建后独一无二且不可变的数据类型,主要是为了解决可能出现…

【截至2023年底】语言模型的发展

什么是大语言模型LLM?ChatGPT、LLAMA各自有什么优势? from: https://www.youtube.com/watch?vt6qBKPubEEo github: https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey,但据说还在更新,到…

数据结构——线性表(顺序存储结构)

语言:C语言软件:Visual Studio 2022笔记书籍:数据结构——用C语言描述如有错误,感谢指正。若有侵权请联系博主 一、线性表的逻辑结构 线性表是n个类型相同的数据元素的有限序列,对n>0,除第一元素无直接…

设置MariaDB,创建新库,新用户并授权其可以从任何主机登录

OS:CENTOS 7 1、从系统进入MariaDB # mysql -u root -p 这里的root是指MariaDB的管理员用户,和系统的root不搭边,只是同名而已。 2、看下有哪些库、用户 MariaDB [(none)]> show databases; MariaDB [(none)]>select user,host from mysql.us…