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

使用Fetch API时注意的跨域问题

跨域问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dATiYxVm-1663952263337)(D:\2022.js\imgs\image-20220814105448882.png)]

  • 只要协议、主机、端口之一不同,就不同源,例如
    • http://localhost:7070/a 和 https://localhost:7070/b 就不同源
  • 同源检查是浏览器的行为,而且只针对 fetch、xhr 请求
    • 如果是其它客户端,例如 java http client,postman,它们是不做同源检查的
    • 通过表单提交、浏览器直接输入 url 地址这些方式发送的请求,也不会做同源检查
  • 更多相关知识请参考
    • 跨源资源共享(CORS) - HTTP | MDN (mozilla.org)

请求响应头解决

请添加图片描述

  • fetch 请求跨域,会携带一个 Origin 头,代表发请求的资源源自何处,目标通过它就能辨别是否发生跨域
    • 我们的例子中:student.html 发送 fetch 请求,告诉 tomcat,我源自 localhost:7070
  • 目标资源通过返回 Access-Control-Allow-Origin 头,告诉浏览器允许哪些源使用此响应
    • 我们的例子中:tomcat 返回 fetch 响应,告诉浏览器,这个响应允许源自 localhost:7070 的资源使用
      实现方式:加入@CrossOrigin(http://localhost:7070)注解
@Controller
public class CrossOriginController {
    @RequestMapping("/api/students")
    @ResponseBody
    @CrossOrigin("http://localhost:7070")
    public List<Student> testCrossOrigin(){
        Student stu1 = new Student(1, "张三", "男", 18);
        Student stu2 = new Student(2, "李四", "女", 23);
        Student stu3 = new Student(3, "王五", "男", 21);
        List<Student> students = Arrays.asList(stu1, stu2, stu3);
        return students;
    }
}

代理解决

在这里插入图片描述

1、在终端中下载插件

npm install http-proxy-middleware --save-dev

2、在 express 服务器启动代码中加入

import {createProxyMiddleware} from 'http-proxy-middleware'

// ...
																											
												//'http://localhost:8080/项目名'
app.use('/api', createProxyMiddleware({ target: 'http://localhost:8080', changeOrigin: true }));

3、fetch 代码改为

const resp = await fetch('http://localhost:7070/api/students')

const resp = await fetch('/api/students')

相关文章:

  • Map和FlatMap的相同点和区别
  • Webpack5高级篇 【学习笔记】
  • 数据结构day13
  • js单行代码------字符串
  • 论道申城 l 拥抱云原生浪潮,奏响数字交响曲
  • T1049晶晶赴约会 (信息学一本通C++)
  • java-php-python-ssmOTET交通在线查询购票系统计算机毕业设计
  • Codeforces Round #822 (Div. 2)
  • 《Knowledge graph completion via complex tensor factorization》理论(下)
  • 89-JavaIO流(概述、分类、体系)、字节输入和输出流(使用、案例-文件拷贝)
  • nutsdb启动速度优化之旅
  • 训练神经网络的详细步骤,如何训练一个神经网络
  • FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇四
  • 01.简单梳理模拟SpringBoot自动装配的原理(代码测试代码)
  • 谷粒商城 高级篇 (二十三) --------- 订单业务
  • 分享一款快速APP功能测试工具
  • 4个实用的微服务测试策略
  • co.js - 让异步代码同步化
  • jdbc就是这么简单
  • node入门
  • Object.assign方法不能实现深复制
  • Selenium实战教程系列(二)---元素定位
  • sessionStorage和localStorage
  • sublime配置文件
  • Terraform入门 - 3. 变更基础设施
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 前端自动化解决方案
  • 一些关于Rust在2019年的思考
  • 赢得Docker挑战最佳实践
  • puppet连载22:define用法
  • #162 (Div. 2)
  • (09)Hive——CTE 公共表达式
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (function(){})()的分步解析
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)为C# Windows服务添加安装程序
  • .net CHARTING图表控件下载地址
  • .net core控制台应用程序初识
  • .Net FrameWork总结
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET程序员迈向卓越的必由之路
  • .net的socket示例
  • .NET中的Exception处理(C#)
  • @media screen 针对不同移动设备
  • @property @synthesize @dynamic 及相关属性作用探究
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android Pro] AndroidX重构和映射
  • [BIZ] - 1.金融交易系统特点
  • [C#] 我的log4net使用手册
  • [C语言]——函数递归
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [HNOI2008]Cards
  • [javaSE] 看知乎学习工厂模式