当前位置: 首页 > news >正文

四种跨域解决方案

文章目录

    • 1.引出跨域
        • 1.基本介绍
        • 2.具体演示
          • 1.启动之前学习过的springboot-furn项目
          • 2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息
          • 3.启动前端项目,取消请求拦截器,这样设置,就会出现跨域
          • 4.跨域原因
    • 2.跨域问题介绍
        • 1.是什么?
        • 2.同源策略
    • 3.跨域流程
        • 1.简单请求和非简单请求
          • 1.简单请求
          • 2.非简单请求(不满足简单请求的就是非简单请求)
        • 2.简单请求-跨域流程
        • 3.非简单请求-跨域流程
        • 4.非简单请求演示
          • 1.这里的添加就是非简单请求
          • 2.测试请求,预检请求失败,不会发送真实请求
    • 4.跨域解决方案
        • 1.Nginx反向代理
        • 2.配置服务器允许跨域
        • 3.前端启用代理,配置同源
    • 5.跨域实操
        • 1.全局CORS配置
          • 1.后端编写配置类 CorsConfig.java
          • 2.成功解决跨域
          • 3.查看响应头,后端允许跨域
        • 2.添加CORS配置类(只是跟上面的形式不同)
          • 1.后端编写配置类 WebMvcConfig.java
          • 2.成功解决跨域
        • 3.使用Filter方法实现
          • 1.后端创建一个过滤器 CorsFilter.java
          • 2.启动类添加 @ServletComponentScan 注解,扫描servlet组件
          • 3.成功解决跨域
        • 4.Vue项目启用代理
          • 1.在vue.config.js中添加代理
          • 2.修改请求以/api的方式发送请求
          • 3.成功解决跨域
    • 6.跨域小结
        • 1.同源策略限制内容
        • 2.请求跨域了,到底发出去没有
        • 3.form表单可以跨域提交的,但是Ajax请求不可以跨域请求
        • 4.推荐跨域处理方式

1.引出跨域

1.基本介绍

image-20240515085751169

2.具体演示
1.启动之前学习过的springboot-furn项目

image-20240515090423854

2.浏览器直接访问 localhost:8081/furns 可以显示信息

image-20240515090504976

3.启动前端项目,取消请求拦截器,这样设置,就会出现跨域

image-20240515092219659

image-20240515092248401

4.跨域原因
  • 当前端项目请求到后端,会返回跨域请求拦截
  • 原因是浏览器默认执行同源策略,会禁止读取localhost:8081的资源

2.跨域问题介绍

1.是什么?

image-20240515093221398

2.同源策略

image-20240515093525190

3.跨域流程

1.简单请求和非简单请求
1.简单请求

image-20240515094205791

2.非简单请求(不满足简单请求的就是非简单请求)
2.简单请求-跨域流程

image-20240515094529863

3.非简单请求-跨域流程

image-20240515094802953

4.非简单请求演示
1.这里的添加就是非简单请求

image-20240515095045529

2.测试请求,预检请求失败,不会发送真实请求

image-20240515095205895

4.跨域解决方案

1.Nginx反向代理

image-20240515095549092

image-20240515095608460

2.配置服务器允许跨域

image-20240515100001936

image-20240515100018589

image-20240515095916927

3.前端启用代理,配置同源

image-20240515102905203

5.跨域实操

1.全局CORS配置
1.后端编写配置类 CorsConfig.java
package com.sun.furn.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;/*** Description: 全局跨域配置** @Author sun* @Create 2024/5/15 10:42* @Version 1.0*/
// 全局跨域配置
@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {// 创建跨域配置,添加 CORS 配置信息final CorsConfiguration corsConfiguration = new CorsConfiguration();// 跨域请求默认不包含 cookie,设置为 true 可以包含 cookiecorsConfiguration.setAllowCredentials(true);// 支持哪些来源的请求跨域, 支持corsConfiguration.addAllowedOriginPattern("*");// corsConfiguration.addAllowedOrigin("*");// 支持哪些头信息corsConfiguration.addAllowedHeader("*");// 支持哪些方法跨域corsConfiguration.addAllowedMethod("*");// 添加映射路径final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource= new UrlBasedCorsConfigurationSource();// /** 是一个正则表达式,表示所有请求 the mapping pattern// corsConfiguration 跨域配置urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);// 返回新的 CorsFilter.return new CorsFilter(urlBasedCorsConfigurationSource);}
}
2.成功解决跨域

image-20240515114309118

3.查看响应头,后端允许跨域

image-20240515114601343

2.添加CORS配置类(只是跟上面的形式不同)
1.后端编写配置类 WebMvcConfig.java
package com.sun.furn.config;/*** Description: 全局跨域配置** @Author sun* @Create 2024/5/15 11:49* @Version 1.0*/import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 允许跨域访问的路径.allowedOriginPatterns("*") // 允许跨域访问的源.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法.maxAge(3600) // 预检间隔时间.allowCredentials(true); // 是否发送cookie}
}
2.成功解决跨域

image-20240515115413519

3.使用Filter方法实现
1.后端创建一个过滤器 CorsFilter.java
package com.sun.furn.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Description: 使用过滤器解决跨域问题** @Author sun* @Create 2024/5/15 13:25* @Version 1.0*/
@WebFilter(urlPatterns = "*")
public class CorsFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest)request;HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setCharacterEncoding("UTF-8");httpResponse.setContentType("application/json; charset=utf-8");httpResponse.setHeader("Access-Control-Allow-Origin", "*");httpResponse.setHeader("Access-Control-Allow-Credentials", "true");httpResponse.setHeader("Access-Control-Allow-Methods", "*");httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");httpResponse.setHeader("Access-Control-Expose-Headers", "*");filterChain.doFilter(httpRequest, httpResponse);}@Overridepublic void destroy() {}
}
2.启动类添加 @ServletComponentScan 注解,扫描servlet组件

image-20240515132812176

3.成功解决跨域

image-20240515133029850

4.Vue项目启用代理
1.在vue.config.js中添加代理
// 跨域配置
module.exports = {devServer: {port: 9999,  // 本地服务端口proxy: { //设置代理,必须填'/api': { //设置拦截器 拦截器格式 斜杠+拦截器名字,名字可以自己定target: 'http://localhost:8081', //代理的目标地址changeOrigin: true, //是否设置同源,输入是的pathRewrite: { //路径重写'/api': '' //选择忽略拦截器里面的单词}}}}
}
2.修改请求以/api的方式发送请求

image-20240515134747244

3.成功解决跨域
  • 这种方式就相当于是本机对携带/api的请求进行代理,请求携带 Sec-Fetch-Site:same-origin 表示允许跨域

image-20240515134846979

6.跨域小结

1.同源策略限制内容

image-20240515135627856

2.请求跨域了,到底发出去没有

image-20240515135817054

3.form表单可以跨域提交的,但是Ajax请求不可以跨域请求

image-20240515135946250

4.推荐跨域处理方式
  • 服务器端解决跨域
  • Nginx动静分离 + 反向代理

相关文章:

四种跨域解决方案

文章目录 1.引出跨域1.基本介绍2.具体演示1.启动之前学习过的springboot-furn项目2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息3.启动前端项目,取消请求拦截器,这样设置,就会出现跨域4.跨域原因 2.跨…...

移动端投屏到大屏幕的操作详解

如果你懒得折腾电脑、电视或其他大屏设备上的影视软件安装及配置,可以选择直接在手机端上将影片投屏到电脑、电视或其他大屏设备上,这里给大家分享三种手机投屏的方法。 系统自带的投屏功能 不管是安卓、鸿蒙还是苹果操作系统,都自带了无线…...

【环境搭建】3.阿里云ECS服务器 安装Redis

在阿里云的 Alibaba Cloud Linux 3.2104 LTS 64位系统上安装 Redis 可以通过以下步骤完成: 1.更新系统软件包: 首先,更新系统软件包以确保所有软件包都是最新的: sudo yum update -y2.安装编译工具和依赖项: Redis…...

动态语言的开源编译器汇总

对于动态语言而言,我们通常不会使用传统意义上的“编译器”,因为动态语言往往是在运行时解释执行的,或者被转换为中间形式(如字节码),再由虚拟机执行。不过,为了性能考虑,现代动态语…...

Linux防火墙配置001

Linux防火墙主要用于控制网络流量,保护系统安全。在Linux中,有几种不同的防火墙管理工具,其中最常见的是iptables和firewalld。本章主要讲述如何关闭防火墙。 操作系统: CentOS Stream 9 操作步骤: 关闭防火墙&…...

Tomcat概述及部署

目录 一.Tomcat概述 1.介绍 2.使用场景 3.组件构成 4.组件结构 5.请求过程 二.Tomcat部署 1.关闭防火墙 2.下载安装JDK 3.安装启动tomcat 4.部署虚拟主机 4.1.创建 xy101 和 xy102 项目目录和文件 4.2.修改 Tomcat 主配置文件 server.xml 一.Tomcat概述 1.介绍 …...

[Vue3:Vite构建项目]:安装router实现登录页面路由跳转

文章目录 一:前置依赖查看依赖安装vite npm create vitelatest sys-instruction-0607 --template vue-ts安装路由:npm install vue-router4安装elementUI:npm install element-plus --save 二:配置文件:views&#xff…...

概率论与数理统计,重要知识点——全部公式总结

二、一维随机变量及其分布 五个分布参考另外一篇文章 四、随机变量的数字特征 大数定理以及中心极限定理 六、数理统计...

Spring系列-SpringMvc父子容器启动原理解析

1、Spring整合SpringMVC 特性: 说到Spring整合SpringMVC唯一的体现就是父子容器: 通常我们会设置父容器(Spring)管理Service、Dao层的Bean, 子容器(SpringMVC)管理Controller的Bean .子容器可以访问父容器的Bean, 父容器无法访…...

[ssi-uploader插件]解决如何接收服务器返回数据+修改参数名称

前言 ssi-uploader是一款非常好用的多文件上传插件,源码是开源的,在github上面即可下载: https://github.com/ssbeefeater/ssi-uploader 但是源码有些微小的不足,今天我们解决两点问题: 上传文件完成后&#xff0c…...

InfiniGate自研网关实现思路七

25.网关Nginx负载模型配置 通过模拟多个HTTP服务配置到 Nginx 做负载均衡,以学习API网关负载的配置和使用 API 网关是用于支撑分布式 RPC 接口协议转换提供 HTTP 调用的一套服务,那么 API 网关系统就需要可横向扩展来满足系统的吞吐量诉求。所以这里需…...

277 基于MATLAB GUI火灾检测系统

基于MATLAB GUI火灾检测系统,可以实现图片和视频的火苗检测。火焰识别的三个特征:1个颜色特征,2个几何特征颜色特征:HSV颜色空间下,对三个通道值进行阈值滤波,几何特征1:长宽比,几何…...

【西瓜书】4.决策树

1 递归返回情况 (1)结点包含样本全为同一类别 (2)属性集为空,没有属性可供划分了 或 有属性,但是在属性上划分的结果都一样 (3)结点为空结点 **结束时判定该结点的类别遵循如下规则&…...

区块链--Ubuntu上搭建以太坊私有链

1、搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:Releases ethereum/mist GitHub 2、安装geth客户端 sudo apt-get update …...

菜品信息分页查询——后端SpringBoot

1.分页查询的逻辑: 页面发送ajax请求,将分页查询参数(page,pageSize, name)提交到服务端,获取分页数据; 页面发送请求,请求服务端进行图片下载,用于页面图片展示。 开发菜品信息分页查询功能&a…...

利用GPT和PlantUML快速生成UML图用于设计

在软件开发中,设计阶段可是关键的一步。UML(统一建模语言)图能帮我们更清晰地理解和规划系统结构,但手动画UML图有时会很费时费力。好消息是,通过结合使用ChatGPT和PlantUML,我们可以高效地生成UML图&#…...

web-上传项目文件夹到Git远程仓库

Git初识 概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容 检验成功 打开bash终端(git专用)命令…...

使用OpenPCDet训练与测试Transformer模型:如何加载自己的数据集

引言 Transformer架构因其强大的序列处理能力和长距离依赖捕捉能力,在自然语言处理领域取得了巨大成功。近年来,这一架构也被引入3D物体检测领域,如Voxel Transformer等,显著提升了模型在复杂场景下的检测性能。OpenPCDet整合了多…...

四舍五入问题

单纯输出四舍五入可以用 printf("%.nf",num); 但是这个方法有时候会出错 代表输出n位四舍五入小数 而将数四舍五入赋值给变量可以用round()函数 a round(num); 表示将num四舍五入赋值给a 但是这么些只能转换位四舍五入的整数 可以改…...

零基础入门学用Arduino 第一部分(三)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…...

C++标准库random

random 完整文档看这里 三步走: 选择一种随机数种子选择一个随机数引擎选择一个随机数分布输出 随机数种子 //生成随机数种子,在Linux的实现中,是读取/dev/urandom设备 std::random_device rd; unsigned seed1 rd();// 获取当前时间点作为随机数种子 unsigned seed2 std:…...

电子电气架构——车载诊断DTC一文通

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…...

Golang | Leetcode Golang题解之第129题求根节点到叶节点数字之和

题目: 题解: type pair struct {node *TreeNodenum int }func sumNumbers(root *TreeNode) (sum int) {if root nil {return}queue : []pair{{root, root.Val}}for len(queue) > 0 {p : queue[0]queue queue[1:]left, right, num : p.node.Left, …...

工业信息化SCI期刊,中科院1区TOP,IF=12.3,收稿范围广泛

一、期刊名称 IEEE Transactions on Industrial Informatics 二、期刊简介概况 期刊类型:SCI 学科领域:工程工业 影响因子:12.3 中科院分区:1区TOP 三、期刊征稿范围 IEEE工业信息学汇刊是一本多学科期刊,发表技…...

Spring Boot整合Redis

Spring Boot整合Redis Spring Boot 整合 Redis 是一种常见的做法,用于在 Spring Boot 应用程序中添加缓存、会话管理分布式锁等功能。 浅谈Redis Redis用于存储数据,且在内存当中进行存储。 但是在日常编写代码时,定义一个变量也就是属于在内…...

kafka的leader和follower

leader和follower kafka的leader和follower是相对于分区有意义的,不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中,并在leader挂掉后重新选举出leader。 kafka会再…...

git 空仓库笔记

标识身份,建议先完成 Git 全局设置 git config --global user.name “账号” git config --global user.email “email” 方式一:克隆仓库 git clone https://url/your.git cd your_path touch README.md git add README.md git commit -m "add …...

字母异位词分组(charyw)

字母异位词分组 题目描述 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 输入格式 第一行正整数n&#xff0c;表示有n个字符串(1<n<1000) 第二行n个字符串&#xff0c;空格隔开 输出格式 多组字母…...

力扣 41.缺少的第一个正整数

题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 …...

Git从入门到放弃

由于我的Git学的不太好&#xff0c;所以为了能够将以后我的学习笔记能够整理的更好&#xff0c;我先要系统的学习一下git&#xff0c;文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网&#xff0c;Git也不例外。ht…...

怎样做网站管理/青岛网络优化厂家

http://archive.ics.uci.edu/ml/databases/synthetic_control/ 继续 转载于:https://www.cnblogs.com/zlslch/p/6673739.html...

企业网站推广的方法有( )/宁波网站seo哪家好

无论你是初学者还是经验丰富的开发人员&#xff0c;对于你和你的团队来说&#xff0c;提高异常处理的能力可以更好的解决问题。Java中的异常处理并不是一件容易的事&#xff0c;初学者会觉得很难理解&#xff0c;即使是经验丰富的开发人员也可能需要花费几个小时来讨论应该如何…...

我想自己创建购物网站/网站一般需要怎么推广

一、包名 包名命名规范:包名一律小写,采用如下规则&#xff1a;【com】.【公司名/组织名】.【项目名称】.【模块名】,例如:com.foreverstar.xxx 1.com.xx.应用名称缩写.模块.activity 页面用到的Activity类 (activitie层级名用户界面层) 2.com.xx.应用名称缩写.模块.fragment …...

企业网站建设商城/云南网站seo服务

Go 时间戳 程序的一个通常需求是计算从Unix起始时间开始到某个时刻的秒数&#xff0c;毫秒数&#xff0c;微秒数等。 我们来看看Go里面是怎么做的。package main import "fmt" import "time" func main() { // 使用Unix和UnixNano来分别获取从Unix起始时间…...

江西疫情最新通报今天/点石关键词排名优化软件

在使用vue做开发的时候&#xff0c;我们有时会遇到需要保留组件状态的情况&#xff0c;防止页面重新绘制&#xff0c;这时候就需要使用keep-alive组件&#xff0c;该组件属于vue的内置组件&#xff0c;同transition一样&#xff0c;他本身不会渲染。 当组件在 <keep-alive&g…...

中国建设会计协会网站首页/学生制作个人网站

各种ESB产品比较 主流商业和开源ESB的发展趋势、可借鉴的地方和其缺点&#xff1a; 主要介绍&#xff1a;Oracle Service BusWebSphereMessageBrokerMuleServiceMix/FUSE ESBSynapse/WSO2 ESBESB产品一览表包括商业和开源&#xff1a; 类型产品公司商业Oracle Service Bus (OSB…...