四种跨域解决方案

文章目录

    • 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动静分离 + 反向代理

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

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

相关文章

使用安装包安装飞桨寒武纪版本@启智(未通过)

飞桨安装手册 安装PaddlePaddle。 该命令会自动安装飞桨主框架每日自动构建的nightly-build版本: python -m pip install paddlepaddle --pre -i https://www.paddlepaddle.org.cn/packages/nightly/cpu/ 安装CustomDevice。 该命令会自动安装飞桨Custom Device…

Intel VT-x怎么开启?如何解决VMware打开虚拟机报错问题?

许多小伙伴在安装完VMware不能打开虚拟机,每次打开都会出现一个“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的报错,然后因此启动不了虚拟机。今天小编就带来如何解决这个报错的方法。 什么是Intel VT-x? 这是英特尔cp…

玩转ChatGPT:最全学术论文提示词分享【中】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 本篇文章,我们继续为大家分享「最全学术论文提示词【中】」。上篇文章的内容请到文末链接处跳转👇🏻 6.数据分析 prompt 1:分析[定量/定…

Docker面试整理-什么是Docker Compose?

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你使用一个 YAML 文件来配置应用服务的所有相关参数,然后通过一个单一的命令来创建和启动所有服务。Docker Compose 主要面向开发、测试和生产环境,使得容器的管理变得更简单、更高效。 主要功能和优…

Dockerfille解析

用于构建Docker镜像的文本,由一条条指令构成 Docker执行Dockerfile的流程 1. Docker从基础镜像执行一个容器 2. 执行一条指令并对容器进行修改 3. 执行类型Docker commit的命令添加一个新的镜像层 4. Docker再基于新的镜像执行一个新的容器 5. 执行Dockerfile中…

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

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

opera打不开网页最简单的解决办法

如果以上为解决问题,继续下面操作 检查网络连接: 确认您的电脑已连接到互联网。 检查网络连接是否稳定,网络速度慢或链路拥堵可能会导致网页加载失败。 修改Local State文件: 关闭Opera浏览器。 定位到Opera浏览器的配置…

【Mtk Camera开发学习】05 MTK Camera 多帧开启、关闭

本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 多帧默认是开启的,正式版本编译,可以通过修改ProjectCofig.mk进行配置。本地临时调试,也可以通过adb命令控制。 ===============================…

植物大战僵尸杂交版2024潜艇伟伟迷

在广受欢迎的游戏《植物大战僵尸》的基础上,我最近设计了一款创新的杂交版游戏,简直是太赞了!这款游戏结合了原有游戏的塔防机制,同时引入新的元素、角色和挑战,为玩家提供了全新的游戏体验。 植物大战僵尸杂交版最新绿…

使用cv2控制鼠标实现circle的拖拽

2.代码 import numpy as np import cv2x_center [100,200,300,400] y_center [200,200,200,200] radius 30def mouse_LButtonDown(event, x, y, flags, param):global tempif event cv2.EVENT_LBUTTONDOWN:print(f" Down Clicked at ({x}, {y})")for i in range…

【leetcode】LRU LFU

什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。 关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。…

算法设计与分析-分支限界

问题A: 分支限界法-单源最短路径问题 题目描述 已知一个加权有向图(为了计算方便,假设编号为1的顶点是入度为0的源点,编号为n的顶点是出度为0的汇点,图中的顶点从1开始编号),要求计算图中从源点出发到汇点…

武汉理工大学云计算与服务计算——6.虚拟化技术习题

20世纪60年代IBM公司推出虚拟化技术 虚拟化技术的核心思想是利用软件或固件管理程序构成虚拟化层,把物理资 源映射为虚拟资源。 在虚拟资源上可以安装和部署多个虚拟机,实现多用户 共享物理资源。 1.虚拟化技术在云计算中的哪些地方发挥了关…

SpringBoot图书管理系统【附:资料➕文档】

前言:我是源码分享交流Coding,专注JavaVue领域,专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享,定制和毕业设计服务! 免费获取方式--->>文章末尾处! 项目介绍048: 图…

自然语言处理(NLP)—— 符号方法与符号语言

1. 符号方法 1.1 雅各布森的结构主义 雅各布森的结构主义是一种语言学理论,它强调了语言结构中的两个基本维度:轴与范畴。这两个维度是理解雅各布森结构主义的核心概念。 1.1.1 轴向对立 句法轴(Syntagmatic Axis):这…

【ARM Cache 与 MMU 系列文章 7.7 – ARMv8/v9 MMU Table 表分配原理及其代码实现 1】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU Table 表分配原理及其代码实现虚拟地址空间 Region的配置系统物理地址位宽获取汇编代码实现MMU Table 表分配原理及其代码实现 假设当前系统中需要映射多个region,其中第一个要映…

【Linux】进程4——进程状态

1.进程状态 什么是状态? 每个人都有状态——颓废,阳光,积极向上。。。。 进程也有状态 在操作系统中,由于进程的数量是非常多的,而系统的资源又非常少,所以不可能每一个进程在每时每刻都会处于上处理机运…

【python报错】list indices must be integers or slices, not tuple

【Python报错】list indices must be integers or slices, not tuple 在Python中,列表(list)是一种常用的数据结构,用于存储一系列的元素。当你尝试使用不支持的索引类型访问列表元素时,会遇到list indices must be in…

OS复习笔记ch7-3

承接上文我们讲完了页式管理和段式管理,接下来让我们深入讲解一下快表和二级页表 快表 快表和计算机组成原理讲的Cache原理如出一辙。为了减少访存的次数,OS在访问页面的时候创建了快表(Translation Lookaside Buffer ,简称TLB&…

pikachu靶场全流程

目录​​​​​​​ 暴力破解: 1.基于表单的暴力破解: 2.验证码绕过(on server): 3.验证码绕过(on client): token防爆破: XSS: 1.反射型xss(get): 2.反射性xss(post): 3.存…