四种跨域解决方案

news2024/11/26 12:34:26

文章目录

    • 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 {
    @Bean
    public CorsFilter corsFilter() {
        // 创建跨域配置,添加 CORS 配置信息
        final CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 跨域请求默认不包含 cookie,设置为 true 可以包含 cookie
        corsConfiguration.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 {
    @Override
    public 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 {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public 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);
    }
    @Override
    public 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动静分离 + 反向代理

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

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

相关文章

YOLOv8改进 | 卷积模块 | 在主干网络中添加/替换蛇形卷积Dynamic Snake Convolution

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 蛇形动态卷积是一种新型的卷积操作,旨在提高对细长和弯曲的管状结构的特征提取能力。它通过自适应地调整卷积核的权重&#xff0…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们可能会遇到一些问题,其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用,因此了解其原因和解决方…

spring源码解析-(2)Bean的包扫描

包扫描的过程 测试代码: // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…

SSL/TLS和HTTPS

HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下: 使用非对称加密协商对称密钥: 在通信的开始阶段,通常由客户端和服务器使用非对称加密算法(如RSA)来协商一个对称密钥。通常情…

2024年全国大学生数据统计与分析竞赛A题论文和代码:抖音用户评论数据统计与情感分析模型

2024年全国大学生数据统计与分析竞赛A题论文和代码已完成,代码为B题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#x…

【JavaScript】内置对象 - 字符串对象 ④ ( 根据索引位置返回字符串中的字符 | 代码示例 )

文章目录 一、根据索引位置返回字符串中的字符1、charAt 函数获取字符2、charCodeAt 函数获取字符 ASCII 码3、数组下标获取字符 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、根据索引位置返回…

Oracle的优化器

sql优化第一步:搞懂Oracle中的SQL的执行过程 从图中我们可以看出SQL语句在Oracle中经历了以下的几个步骤: 语法检查:检查SQL拼写是否正确,如果不正确,Oracle会报语法错误。 语义检查:检查SQL中的访问对象…

语法分析!!!

一、实验题目 根据给定文法编写调试预测分析程序&#xff0c;对任意输入串用预测分析法进行语法分析。 二、实验目的 加深对预测分析法的理解。 三、实验内容 四、实验代码 #include <iostream> #include <stdio.h> #include <string> #include <…

鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 当今信息技术领域日新月异&#xff0c;各种新技术和新平台层出不穷。鸿蒙&#xff08;HarmonyOS&#xff09;、Flutter、以及车载应用开发…

Cell-在十字花科植物中年生和多次开花多年生开花行为的互相转化-文献精读21

Reciprocal conversion between annual and polycarpic perennial flowering behavior in the Brassicaceae 在十字花科植物中年生和多次开花多年生开花行为的互相转化 亮点 喜马拉雅须弥芥 和 内华达糖芥 是两个多年生植物模型 MADS-box 基因的剂量效应决定了一年生、二年生…

树莓派4B 零起点(一) 树莓派 无屏 从购买到启动

目录 背景 一. 准备工作 二、烧录系统 三、连接系统 背景 准备开发ROS机器人&#xff0c;在淘宝上购买的树莓派4B(4G)到货了&#xff0c;配件都很齐全&#xff0c;那么就直接开箱验货。 一. 准备工作 1 、硬件&#xff1a;(如下图) (我的购买链接: 树莓派4B 4g 套件) 2…

信号:干扰类别及特征提取(二)

目录 第二部分&#xff1a;特征提取 一&#xff1a;瞬时特征参数 1.零中心归一化瞬时幅度之谱密度的最大值 2.非弱信号段零中心归一化瞬时幅度的标准偏差 3.零中心归一化瞬时幅度绝对值的标准偏差 4.零中心归一化非弱信号段瞬时频率的标准偏差 5.零中心归一化非弱信号段…

OpenCV学习 基础图像操作(十七):泛洪与分水岭算法

原理 泛洪填充算法和分水岭算法是图像处理中的两种重要算法&#xff0c;主要用于区域分割&#xff0c;但它们的原理和应用场景有所不同&#xff0c;但是他们的基础思想都是基于区域迭代实现的区域之间的划分。 泛洪算法 泛洪填充算法&#xff08;Flood Fill&#xff09;是一…

【Autopilot】没有自动添加本地管理员的问题处理

【问题】某公司选用了D记的笔记本电脑&#xff0c;约定出厂就预配置好Autopilot&#xff0c;当时向D记提供了三个信息&#xff1a; 1. M365的租户ID 2. 公司域名信息 3. Group Tag (某公司为跨国公司&#xff0c;通过Group Tag来区分国家&#xff0c;比如CHN-中国&#xff0c;L…

【模拟-BM99 顺时针旋转矩阵】

题目 BM99 顺时针旋转矩阵 描述 有一个NxN整数矩阵&#xff0c;请编写一个算法&#xff0c;将矩阵顺时针旋转90度。 给定一个NxN的矩阵&#xff0c;和矩阵的阶数N,请返回旋转后的NxN矩阵。 分析 模拟&#xff0c;写几个样例&#xff0c;分析一下新矩阵元素下标与原矩阵元素…

前端工程化:基于Vue.js 3.0的设计与实践

这里写目录标题 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍引言本书概述主要内容作者简介为什么选择这本书&#xff1f;结语 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍 够买连接—>https://item.jd.com/13952512.html 引言 在前端技术日…

17、matlab实现均值滤波、中值滤波、Butterworth滤波和线性相位FIR滤波

1、创建信号 1&#xff09;创建正余弦信号、噪声信号和混合信号 原始正余弦信号公式&#xff1a;Signal1 sin(2*pi*20* t) sin(2*pi*40* t) sin(2*pi*60* t) 高斯分布的白噪声&#xff1a;NoiseGauss [randn(1,2000)] 均匀分布的白噪声&#xff1a;[rand(1,2000)] 正余弦…

k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)HPA详细解释与案例应用

文章目录 前言HPA简介简单理解详细解释HPA 的工作原理监控系统负载模式HPA 的优势使用 HPA 的注意事项应用类型 应用环境1.metircs-server部署2.HPA演示示例&#xff08;1&#xff09;部署一个服务&#xff08;2&#xff09;创建HPA对象&#xff08;3&#xff09;执行压测 前言…

278 基于Matlab GUI的中重频PD雷达仿真系统

基于Matlab GUI的中重频PD雷达仿真系统。具有26页文档报告。仿真雷达信号的发射、传播、散射、接收、滤波、信号处理、数据处理的全部物理过程&#xff0c;因此应当实现对雷达发射机、天线、接收机、回波信号处理、数据处理的建模与仿真。程序已调通&#xff0c;可直接运行。 2…

自定义类型:结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…