Spring-Cloud GateWay+Vue 跨域方案汇总

文章目录

    • 一、简介
      • 背景和概述
    • 二、前端跨域解决方案
      • Axios跨域
      • CORS跨域
    • 三、后端跨域解决方案
      • 反向代理服务器
    • 四、Spring Cloud中的跨域解决方案
      • Gateway网关的跨域配置
    • 五、基于Vue和Spring Cloud的跨域整合实践
    • **`这两种配置只需配置一种即可生效(前端or后端)`**
      • 前端Vue项目配置
      • 后端Spring Cloud项目配置
    • 六、总结

一、简介

背景和概述

在开发Spring Cloud和Vue的项目时,涉及到前后端分离的情况下,跨域成为一个常见的问题。本文将介绍跨域问题的背景,并提供了一些解决方案。
在这里插入图片描述

二、前端跨域解决方案

Axios跨域

Axios是一个流行的基于Promise的HTTP客户端,用于浏览器和Node.js。它可以使发送HTTP请求变得更加简单和高效。
一般前端使用axios进行http请求发送

import axios from 'axios'
// 利用axios对象的方法create,创建一个axios实例
const request = axios.create({baseURL: "http://localhost:8080",timeout: 3000000, //请求超时的时间withCredentials: true, // 打开withCredentials选项crossDomain: true,
})// request 请求拦截器,在发请求之前,请求拦截器可以检测到
//config:配置对象,里面有一个属性是headers请求头
request.interceptors.request.use(config => {// 设置允许跨域的域名和请求方法config.headers['Access-Control-Allow-Origin'] = '*';config.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE';return config
}, error => {return Promise.reject(error)
});// response 响应拦截器
request.interceptors.response.use(//响应成功回调函数response => {let res = response.data;return res;},//响应失败的回调函数error => {Toast.clear()console.log('err' + error)return Promise.reject(error)}
)// 对外暴露
export default request

CORS跨域

CORS(Cross-Origin Resource Sharing)是一种跨域访问资源的标准,可以通过在服务器端设置响应头来实现跨域请求。以下是CORS的示例代码:

// 在后端Spring MVC控制器中配置CORS
@CrossOrigin
@RestController
@RequestMapping("/api")
public class MyController {// 控制器的方法
}

三、后端跨域解决方案

反向代理服务器

使用反向代理服务器可以将前端请求转发到后端服务器,从而绕过跨域限制。以下是反向代理服务器的示例代码:
这里nginx是要和你的前端服务在一台服务器上的,然后你访问的时候通过前端的nginx进行转发的后端服务器才行

# NGINX反向代理配置示例
location /api {proxy_pass http://backend-server;
}

四、Spring Cloud中的跨域解决方案

Gateway网关的跨域配置

整个项目中只需要配置网关的配置文件即可,其他地方(前后端)都不需要在进行更改
在Spring Cloud中使用Gateway作为网关时,可以通过配置来处理跨域请求。以下是Gateway网关的跨域配置的示例代码:

# 在Gateway网关中配置跨域
spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedHeaders: "*"allowedMethods: "*"

在这里插入图片描述

五、基于Vue和Spring Cloud的跨域整合实践

这两种配置只需配置一种即可生效(前端or后端)

前端Vue项目配置

在Vue项目中进行跨域配置,确保前端请求能够访问后端服务。以下是前端Vue项目配置的示例代码:
参考:Vue官方文档

// 在Vue项目的配置文件中设置代理
module.exports = {devServer:{proxy:{'/getTest':{target:"http://localhost:7734",  //跨域的域名(不需要写路径)changeOrigin:true,//是否开启跨域// pathRewrite:{  //路径重写//// }}}}
}

后端Spring Cloud项目配置

这是一种方案,还可以使用上面说的gateway配置文件的方式,这两种二选一
在Spring Cloud项目中进行跨域配置,确保后端能够处理前端请求。以下是后端Spring Cloud项目配置的示例代码:

import com.alibaba.nacos.shaded.com.google.common.net.HttpHeaders;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
// 在后端Spring Cloud-GateWay中配置跨域
@Component
@Order(2)
public class CorsResponseHeaderFilter implements GlobalFilter {private static final String ANY = "*";@Override@SuppressWarnings("serial")public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.fromRunnable(() -> {exchange.getResponse().getHeaders().entrySet().stream().filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)).filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)|| kv.getKey().equals(HttpHeaders.VARY))).forEach(kv ->{// Vary只需要去重即可if(kv.getKey().equals(HttpHeaders.VARY)) {kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));} else{List<String> value = new ArrayList<>();if(kv.getValue().contains(ANY)){  //如果包含*,则取*value.add(ANY);kv.setValue(value);}else{value.add(kv.getValue().get(0)); // 否则默认取第一个kv.setValue(value);}}});}));}
}

六、总结

跨域(Cross-Origin Resource Sharing,CORS)是一种浏览器的安全机制,用于限制从一个源(域、协议或端口)加载的Web页面上的资源如何与来自其他源的资源进行交互。当一个 Web 应用程序尝试从一个源加载来自不同源的资源时,浏览器将执行跨域检查。

跨域限制的目的是保护用户隐私和安全,防止恶意网站通过跨域请求来获取用户的敏感信息。如果跨域是允许的,那么一个恶意网站就可以在用户不知情的情况下获取到来自其他网站的数据,这将带来安全风险。

在默认情况下,浏览器会限制跨域请求,例如,从一个域(例如example.com)的页面发起的 AJAX 请求无法直接访问另一个域(例如api.example.com)的资源。这是因为浏览器执行了同源策略(Same-Origin Policy),即只允许在同一个域下加载资源。

为了解决跨域问题,可以使用 CORS 机制来明确指示浏览器允许跨域请求。服务器可以在响应中添加一些特殊的头部(如 “Access-Control-Allow-Origin”)来指定允许访问的来源,即允许跨域请求的网站。

需要注意的是,跨域问题仅存在于浏览器环境中。如果是在服务器之间进行通信,不受同源策略的限制,可以通过其他方式(如代理、反向代理)来实现跨域请求。

总结而言,跨域限制是为了保护用户隐私和安全,防止恶意网站获取敏感信息。使用 CORS 机制可以显式指示浏览器允许跨域请求。

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

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

相关文章

原型链解释

一、什么是原型链 原型链是javascript中用来实现类似类继承的一套机制。像链条一样把javascript中的对象连接起来&#xff0c;实现类似子联系父的现象。 二、原型链的实现 总的来说&#xff0c;就是&#xff1a; 对象的__proto__指向其构造器的prototype对象&#xff0c;然后…

分布式id的概述与实现

文章目录 前言一、分布式id技术选型二、雪花算法三、在项目中集成雪花算法 前言 随着业务的增长&#xff0c;数据表可能要占用很大的物理存储空间&#xff0c;为了解决该问题&#xff0c;后期使用数据库分片技术。将一个数据库进行拆分&#xff0c;通过数据库中间件连接。如果…

postgresql -数据库事务与并发控制

postgresql -数据库事务与并发控制 数据库事务事务控制语句并发与隔离数据库事务 事务控制语句 -- serial 自增 CREATE TABLE accounts(id serial PRIMARY KEY,user_name varchar(50),balance numeric

[php] 文件上传的一个项目emmm

项目完整地址 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>上传文件</title><link href"./css/bootstrap.min.css" rel"stylesheet"><style>font-face {fo…

广州xx策划公司MongoDB恢复-2023.09.09

2023.09.08用户的MongoDB数据库被勒索病毒攻击&#xff0c;数据全部被清空。 提示&#xff1a; mongoDB的默认端口为27017&#xff0c;黑客通常通过全网段扫描27017是否开放判断是否是MongoDB服务器。一旦发现27017开放&#xff0c;黑客就会用空密码、弱密码尝试连接数据库。黑…

经典排序算法总结

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

深入理解JVM虚拟机第四篇:一些常用的JVM虚拟机

一&#xff1a;Sun Classic VM虚拟机 早在1996年Java1.0版本的时候&#xff0c;Sun公司发布了一款名为Sun classic VM的Java虚拟机&#xff0c;它同时也是世界上第一款商用Java虚拟机&#xff0c;JDK1.4时完全被淘汰。 现在hotspot内置了此虚拟机。 这款虚拟机内部只提供解释器…

银行笔试篇---职业能力测试(行测)

数字推理 数字推理可分为等差数列、等比数列、和数列、积数列、幂数列以及分数数列六类&#xff0c;做题时的总体原则为&#xff1a; 关键点1&#xff1a;凡是一次变化找不到规律的&#xff0c;直接放弃&#xff01;所谓一次变化指的是&#xff1a;1.通过一次相邻两数作差、作…

【数据库】Navicate运行数据区sql文件 1046 no database selected

文章目录 前言一、现象二、解决 前言 要通过Navicat导入数据库文件&#xff0c;但是不成功报错1046 no database selected 一、现象 选中已经建立的连接&#xff0c;右键运行sql文件&#xff0c;报错 二、解决 1、先在建立的localhost中右键建立和要导入数据库同名的数据…

C++信息学奥赛1170:计算2的N次方

#include <iostream> #include <string> #include <cstring>using namespace std;int main() {int n;cin >> n; // 输入一个整数nint arr[100];memset(arr, -1, sizeof(arr)); // 将数组arr的元素初始化为-1&#xff0c;sizeof(arr)表示arr数组的字节…

【STM32】影子寄存器

不可操作但是真正起作用的寄存器是影子寄存器 定时器框图中&#xff0c;有些寄存器下有个阴影 这些阴影的表示这些寄存器存在影子寄存器。 图中也有对这些影子的说明&#xff0c;在U事件时传送预装载寄存器至实际寄存器。 有阴影的寄存器(AutoReloadRegister)&#xff0c;表…

数据库管理软件NoSQLBooster for MongoDB 8.1 Mac

NoSQLBooster for MongoDB 是一款功能强大的 MongoDB 数据库管理工具。它提供了一个直观的用户界面&#xff0c;使用户能够轻松地浏览、查询和修改 MongoDB 数据库中的数据。 NoSQLBooster for MongoDB 支持多种查询方式&#xff0c;包括基本查询、聚合管道、地理空间查询等。它…

Python解析MDX词典数据并保存到Excel

原始数据和处理结果&#xff1a; https://gitcode.net/as604049322/blog_data/-/tree/master/mdx 下载help.mdx词典后&#xff0c;我们无法直接查看&#xff0c;我们可以使用readmdict库来完成对mdx文件的读取。 安装库&#xff1a; pip install readmdict对于Windows平台还…

【建站教程】使用阿里云服务器怎么搭建网站?

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;阿小云来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#x…

绝热量热法反应热测试过程中的温度和压力自动跟踪控制解决方案

摘要&#xff1a;现有的ARC加速量热仪普遍存在单热电偶温差测量误差大造成绝热效果不好&#xff0c;以及样品球较大壁厚造成热惰性因子较大&#xff0c;都使得ARC测量精度不高。为此本文提出了技术改进解决方案&#xff0c;一是采用多只热电偶组成的温差热电堆进行温差测量&…

ChatGPT提示词(prompt)资源汇总

文章目录 awesome-chatgpt-promptsLearn PromptingSnack PromptFlow GPTPrompt VineChatGPT 指令大全AI Toolbox HubAI Short ChatGPT是一种强大的生成式AI模型&#xff0c;而提示词&#xff08;prompt&#xff09;则是与ChatGPT一起使用的指导性文本&#xff0c;用于引导模型生…

R语言并行计算提高速度丨parallel包和foreach包

并行计算提高R语言速度 今天与大家分享的是R语言中的并行计算的内容&#xff0c;将探讨如何使用parallel和foreach包在R中进行并行计算&#xff0c;以及在不同情况下提高计算效率的方法。 目标&#xff1a;让计算等待时间缩短&#xff01; 1. 什么是并行计算&#xff1f; 并行计…

《Linkerd 2.0:下一代服务网格的探索》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

数据结构——排序算法——插入排序

交换法插入排序 void swap(vector<int> arr, int i, int j) {int temp arr[i];arr[i] arr[j];arr[j] temp;}void insertSort(vector<int> arr) {// 从第二个数开始&#xff0c;往前插入数字for (int i 1; i < arr.size(); i) {// j 记录当前数字下标int j …

WPS或EXCEL表格单元格下拉快捷选择项修改及设置方法

WPS或新版本EXCEL的设置下拉选项的方法是.点击一个单元格,菜单上选择数据,下拉列表即可设置,双击文字可编辑 EXCEL 旧的版本不同,可能有不同方法 方法一, 1.在空白区域里面&#xff0c;准备好需要填入下拉菜单里面的内容。 2.选中一个需要添加下拉菜单的单元格&#xff0c;然后…