【VUE】跨域问题的概念,以及解决方法。

2024-09-09 07:36

本文主要是介绍【VUE】跨域问题的概念,以及解决方法。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.跨域概念

2.解决方法

2.1 配置网络请求代理

2.2 使用@CrossOrigin 注解

2.3 通过配置文件实现跨域

2.4 添加 CorsWebFilter 来解决跨域问题


1.跨域概念

  • 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。
  • 一般在springboot+vue前后端分离项目中,前端应用(Vue.js)通常运行在一个不同的域名或端口上,而后端服务(Spring Boot)则运行在另一个,则会产生跨域问题。

2.解决方法

2.1 配置网络请求代理

在vue项目的vue.config.js 中配置网络请求代理,代码如下:

devServer: {proxy: {'/api': { // 匹配所有以 /api 开头的请求路径target: 'url',//指定代理的目标服务器地址,即后端服务的实际地址。pathRewrite:{'^/api':'' //将请求地址中的/api替换为空字符},changeOrigin: true}}
}

网络请求代理原理:

  • 一个项目可以分为三个部分,浏览器,前端服务器,后端服务器。浏览器首先会向前端服务器发出请求,拿到页面,然后再向后端发出请求,拿到数据填充到页面中。但是由于浏览器的同源策略,当浏览器向再向后端发出请求时,就会报错。
  • 网络请求代理的原理是,在前端服务器中设置一个网络代理,如下图,当浏览器发出以 api 开头的请求时,可以认为是请求后端的数据,否则是请求页面。 当请求后端的数据时,就在前端服务中设置一个访问后端的目标url,这个url访问到数据后,响应给浏览器,这样浏览器就只需要和前端服务器进行交互,间接避免了浏览器的同源策略。

2.2 使用@CrossOrigin 注解

这个主要是针对后端而言,使用 @CrossOrigin 注解可以实现跨域,此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,它的实现如下:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@RestController
@CrossOrigin(origins = "*")//该类的所有单元方法均可实现跨域访问
public class TestController {@RequestMapping("/test")public HashMap<String, Object> test() {return new HashMap<String, Object>() {{put("state", 200);put("data", "success");put("msg", "");}};}
}

注:使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。

2.3 通过配置文件实现跨域

通过设置配置文件的方式就可以实现全局跨域了,它的实现步骤如下:

  1. 创建一个新配置文件。
  2. 添加 @Configuration 注解,实现 WebMvcConfigurer 接口。
  3. 重写 addCorsMappings 方法,设置允许跨域的代码。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration // 一定不要忽略此注解
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 所有接口.allowCredentials(true) // 是否发送 Cookie.allowedOriginPatterns("*") // 支持域.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法.allowedHeaders("*").exposedHeaders("*");}
}

2.4 添加 CorsWebFilter 来解决跨域问题

在 Spring-Framework 从 5.3 版本之前,使用以下代码可以让 Spring Cloud Gateway 网关允许跨域:

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();// 这里仅为了说明问题,配置为放行所有域名,生产环境请对此进行修改config.addAllowedOrigin("*");// 放行的请求头config.addAllowedHeader("*");// 放行的请求类型,有 GET, POST, PUT, DELETE, OPTIONSconfig.addAllowedMethod("*"); // 暴露头部信息config.addExposedHeader("*"); // 是否允许发送 Cookieconfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

而 Spring-Framework 5.3 版本之后,关于 CORS 跨域配置类 CorsConfiguration 中将 addAllowedOrigin 方法名修改为 addAllowedOriginPattern,因此配置了变成了以下这样:

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();// 这里仅为了说明问题,配置为放行所有域名,生产环境请对此进行修改config.addAllowedOriginPattern("*");// 放行的请求头config.addAllowedHeader("*");// 放行的请求类型,有 GET, POST, PUT, DELETE, OPTIONSconfig.addAllowedMethod("*"); // 暴露头部信息config.addExposedHeader("*"); // 是否允许发送 Cookieconfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

:部分知识点总结来源于:https://zhuanlan.zhihu.com/p/679740296 ,想进一步了解的,可以去看。

这篇关于【VUE】跨域问题的概念,以及解决方法。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150546

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工