CORS预检请求配置流程图 srpingboot和uniapp

首先要会判断预检请求 还是简单请求
简单请求
简单请求
预检请求
在这里插入图片描述

简单请求条件
方法限制: GET, HEAD, POST
Content-Type 限制
Headers 限制
CORS 请求
是否满足简单请求条件?
简单请求
预检请求
GET
HEAD
POST with simple Content-Type
PUT, DELETE, PATCH等
POST with complex Content-Type
自定义头部
application/x-www-form-urlencoded
multipart/form-data
text/plain
Accept
Accept-Language
Content-Language
Content-Type 仅限于简单值

解释:

  1. 简单请求:

    • 方法:GET, HEAD, POST
    • 如果是 POST,Content-Type 仅限于:
      • application/x-www-form-urlencoded
      • multipart/form-data
      • text/plain
    • 只包含以下头部:
      • Accept
      • Accept-Language
      • Content-Language
      • Content-Type(仅限于上述值)
  2. 预检请求(非简单请求):

    • 使用其他 HTTP 方法(如 PUT, DELETE, PATCH 等)
    • POST 请求使用其他 Content-Type(如 application/json)
    • 包含自定义头部

当然可以。让我们通过流程图和实际例子来解释简单请求和预检请求(非简单请求)的区别。

首先,我们来看两种请求的流程图:

浏览器 服务器 简单请求 发送请求(GET, POST等) 返回响应(带CORS头) 预检请求 发送OPTIONS预检请求 返回预检响应(带CORS头) 发送实际请求 返回响应 中止请求 alt [预检成功] [预检失败] 浏览器 服务器

这个 CORS 配置允许比较宽松的跨域访问。让我们详细分析一下这个配置对应的前端请求类型:

  1. 创建 StsRequest.java 类:
package com.example.demo;

public class StsRequest {
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
  1. 创建 StsResponse.java 类:
package com.example.demo;

public class StsResponse {
    private String message;

    public StsResponse(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  1. 修改主应用类 DemoApplication.java:
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.bind.annotation.*;

@SpringBootApplication
@RestController
@RequestMapping("/api/gateway/jzgj/app/oss")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
         config.addAllowedOrigin("http://localhost:5173"); // 明确指定允许的源
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

    @PostMapping("/getSts")
    public StsResponse getSts(@RequestBody StsRequest request, @RequestHeader("token") String token) {
        System.out.println("Received request with id: " + request.getId());
        System.out.println("Token: " + token);
        return new StsResponse("STS response for id: " + request.getId());
    }
}
夜店入口
安保模式选择
普通模式
严格模式
不允许的模式
允许所有人进入
不允许携带身份证件
只允许特定人进入
必须携带身份证件
允许所有人进入
允许携带身份证件
config.addAllowedOrigin('*')
config.setAllowCredentials(false)
config.addAllowedOrigin('http://localhost:5173')
config.setAllowCredentials(true)
config.addAllowedOrigin('*')
config.setAllowCredentials(true)
安全但开放
安全且可控
不安全! 不被允许

第二部分: UniApp 前端

<template>
  <view class="content">
    <button @click="getSts">获取 STS</button>
    <text v-if="response">响应: {{ response }}</text>
  </view>
</template>

<script>
export default {
  data() {
    return {
      response: ''
    }
  },
  methods: {
    getSts() {
      uni.request({
        url: 'http://localhost:9999/api/gateway/jzgj/app/oss/getSts',
        method: 'POST',
        header: {
          'Content-Type': 'application/json',
          'token': '806e4f157ab9442dbfa8b33e50a40e26'
        },
        data: {
          id: 1
        },
        success: (res) => {
          this.response = JSON.stringify(res.data);
        },
        fail: (err) => {
          console.error('错误:', err);
          this.response = '发生错误';
        }
      });
    }
  }
}
</script>

<style>
.content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

button {
  margin-top: 20px;
}

text {
  margin-top: 20px;
}
</style>
浏览器(http://localhost:5173) 服务器(http://192.168.110.233:9999) 发送 OPTIONS 预检请求 CorsFilter 处理预检请求 检查 CORS 政策 CorsConfiguration 定义CORS策略 返回预检响应(带CORS头) 发送实际请求 @PostMapping("/getSts") 处理实际请求 返回响应 中止请求 alt [预检成功] [预检失败] 浏览器(http://localhost:5173) 服务器(http://192.168.110.233:9999)
浏览器 (http://localhost:5173) CorsFilter CorsConfiguration 控制器 发送 OPTIONS 预检请求 获取CORS配置 setAllowCredentials(true) addAllowedOrigin("http://localhost:5173") addAllowedHeader("*") addAllowedMethod("*") 返回CORS配置 应用CORS配置 返回预检响应(带CORS头) 发送实际请求 (POST /getSts) @PostMapping("/getSts") 处理请求 返回响应 中止请求 alt [预检成功] [预检失败] 浏览器 (http://localhost:5173) CorsFilter CorsConfiguration 控制器
应用程序 @Bean方法 UrlBasedCorsConfigurationSource CorsConfiguration CorsFilter 调用corsFilter()方法 创建 UrlBasedCorsConfigurationSource 创建 CorsConfiguration setAllowCredentials(true) 允许发送凭证 addAllowedOrigin("http://localhost:5173") 允许特定源 addAllowedHeader("*") 允许所有头部 addAllowedMethod("*") 允许所有HTTP方法 registerCorsConfiguration("/**", config) 对所有路径应用配置 创建 CorsFilter(source) 返回 CorsFilter 应用程序 @Bean方法 UrlBasedCorsConfigurationSource CorsConfiguration CorsFilter

现在让我们详细解释每一行代码:

  1. @Bean public CorsFilter corsFilter() {

    • 这是一个 Spring Bean 定义方法,它会在应用启动时被调用,创建一个 CorsFilter 实例。
  2. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

    • 创建一个 URL 基础的 CORS 配置源,用于管理不同 URL 路径的 CORS 配置。
  3. CorsConfiguration config = new CorsConfiguration();

    • 创建一个新的 CORS 配置对象,用于设置具体的 CORS 规则。
  4. config.setAllowCredentials(true);

    • 允许跨域请求携带凭证信息(如 cookies)。这对于需要身份验证的请求很重要。
  5. config.addAllowedOrigin("http://localhost:5173");

    • 明确指定允许的源。这里只允许来自 http://localhost:5173 的请求,提高了安全性。
  6. config.addAllowedHeader("*");

    • 允许所有的请求头。"*" 表示任何头部都被允许。在生产环境中,您可能想要限制具体的头部。
  7. config.addAllowedMethod("*");

    • 允许所有的 HTTP 方法(GET, POST, PUT, DELETE 等)。同样,"*" 表示所有方法都允许。
  8. source.registerCorsConfiguration("/**", config);

    • 将 CORS 配置注册到配置源上。"/**" 表示这个配置适用于所有的路径。
  9. return new CorsFilter(source);

    • 创建并返回一个新的 CorsFilter 实例,使用配置好的源。

这个配置的主要目的是:

  • 允许来自 http://localhost:5173 的跨域请求
  • 允许这些请求携带凭证信息
  • 允许所有的请求头和 HTTP 方法
  • 将这个配置应用到所有的 API 路径

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

geoserver解析元数据获取图层相关参数

需求&#xff1a; 1、通过geoserver地址获取所有图层名称&#xff1b; 2、加载wms服务&#xff0c;实现自动定位。 获取图层名和范围视图有两种思路&#xff1a; 1、调取geoserver的rest接口。缺点就是需要验证登录。 rest接口官方文档&#xff1a;GeoServer API Docs 2、…

C++(标准输入输出流、命名空间、string字符串、引用)

C特点及优势 &#xff08;1&#xff09;实现了面向对象&#xff0c;在高级语言中&#xff0c;处理运行速度是最快&#xff1b; &#xff08;2&#xff09;非常灵活&#xff0c;功能非常强大&#xff0c;相对于C的指针优势&#xff0c;C的优势为性能和类层次结构&#x…

书生营 L0G4000 玩转HF/魔搭/魔乐社区

模型下载 在codespace上给环境装包&#xff0c;按照教材即可 运行后下载成功 建立下载json文件 新建下载internlm2_5-chat-1_8b的json文件 运行结果 基本上没啥问题&#xff0c;照着教程来就行 模型上传&#xff08;可选&#xff09; push的时候需要先认证token 最后的…

人工智能+医学

医学影响的内型&#xff1a;(X光片、计算机断层扫描、磁共振成像、超声波&#xff09; ITK snap医学图像读取 医学影像领域常见任务: 图像分类、语义分割、疾病预测、目标检测、图像配准、图像生成(应用少)、图像增强、生成放射学报告。 需要有很强的可解释…

Xshell上Linux的基础指令

目录 1、Xshell的使用 2、Linux的常用命令 2.1 位置跳转命令 1、ls 2、cd 3、pwd 2.2 文件操作 1、touch 2、cat 3、echo 4、vim 2.3 目录操作 1、mkdir 2、rm 2.4 移动操作 1、mv 2、cp 2.5 命令手册 2.6 查找操作 2.7 进程展示 2.8 网络信息 3、搭建w…

JS | 详解图片懒加载的6种实现方案

目录 一、什么是懒加载&#xff1f; 二、为什么要懒加载&#xff1f; 三、图片懒加载的实现原理 四、图片懒加载实现方式 3.1 方案一&#xff1a;设置 img 标签属性 loading“lazy” 3.2 方案二&#xff1a;利用JS监听scroll滚动事件 3.3 方案三&#xff1a;利用元素的…

Aatrox-Bert-VITS2部署指南

一、模型介绍 【AI 剑魔 ①】在线语音合成&#xff08;Bert-Vits2&#xff09;&#xff0c;将输入文字转化成暗裔剑魔亚托克斯音色的音频输出。 作者&#xff1a;Xz 乔希 https://space.bilibili.com/5859321 声音归属&#xff1a;Riot Games《英雄联盟》暗裔剑魔亚托克斯 …

Redis——缓存

目录 前言 一、缓存基本概念 1.概念 2.二八定律 二、使用 Redis 作为缓存 三、缓存的更新策略 1.定期生成 2.实时生成 四、Redis 内存淘汰机制 1.通用淘汰策略 &#xff08;1&#xff09;FIFO &#xff08;2&#xff09;LRU &#xff08;3&#xff09;LFU &#…

机器学习在智能水泥基复合材料中的应用与实践

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

Linux 权限的理解

内容摘要 本文内容包括shell的运行原理&#xff0c;包括外壳程序的原理、理解、和意义&#xff0c;以及从两个方面对于权限的理解&#xff08;人和事物的属性&#xff09;、修改文件的权限&#xff0c;包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用…

【linux】线程(二)

10. pthread_t 类型 注意&#xff1a; 每一个线程的库级别的tcb的起始地址&#xff0c;就是线程的 tid每一个线程都有自己独立的栈结构线程和线程之间&#xff0c;也是可以被其他线程看到并访问的&#xff08;比如全局函数&#xff09; 代码 如果想要进程拥有私人的全局变量(即…

关于武汉芯景科技有限公司的限流开关芯片XJ6288开发指南(兼容SY6288)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.EN引脚控制IN和OUT引脚的通断 2.OCB引脚指示状态 3.过流自动断开

C++ [项目] 恶魔轮盘赌

现在才发现C游戏的支持率这么高&#xff0c;那就发几篇吧 零、前情提要 此篇是我与 同学的共创,他负责写人,我负责写机,简称人机, 不过有一点小插曲…… 一、基本介绍 支持Dev-C5.11版本(务必调为英文输入法),基本操作看游戏里的介绍,怎么做的……懒得说,能看懂就看注释,没有…

Vue3结合vue-plugin-hiprint实现自定义打印模板设计与布局

简介 在现代Web应用开发中&#xff0c;打印功能是不可或缺的一部分&#xff0c;尤其是在需要输出标准化文档的场景下。本文将详细介绍如何在Vue3项目中利用vue-plugin-hiprint插件实现一个可定制的打印模板设计器&#xff0c;并通过具体示例来展示其配置与使用方法。 技术栈 …

Python如何导入模块及常见的导入方法

&#x1f600;前言 在 Python 编程中&#xff0c;模块&#xff08;Module&#xff09;是非常重要的工具。它们可以帮助我们将代码进行逻辑分割和复用&#xff0c;从而提高代码的可读性和可维护性。本文将详细介绍如何导入模块、使用常见的导入方法&#xff0c;并简要介绍一些常…

[分享] SQL在线编辑工具(好用)

在线SQL编写工具&#xff08;无广告&#xff09; - 在线SQL编写工具 - Web SQL - SQL在线编辑格式化 - WGCLOUD

若依微服务15 - RuoYi-Vue3 实现前端独立运行

正文开始&#xff1a; RuoYi-Vue3 使用 Vue3 Element Plus Vite 技术栈。 GitHub 开源地址&#xff1a;https://github.com/yangzongzhuan/RuoYi-Vue3 本文介绍使用若依提供的在线后端接口&#xff0c;仅启动前端项目并进行界面开发&#xff0c;而无需启动后端服务。 一、克隆…

Vue笔记-浏览器窗口改变时,重新计算表格高度并设置

当窗口大小改变时&#xff0c;你监听 window 对象的 resize 事件&#xff0c;然后在事件处理程序中重新计算表格的高度。在 Vue 中&#xff0c;可以在组件中通过 created 生命周期钩子来添加事件监听器&#xff0c;然后在组件销毁时移除事件监听器。 如下vue代码&#xff1a; …

33 类与对象 · 下

目录 一、构造函数的深入 &#xff08;一&#xff09;构造函数的其他特点 &#xff08;二&#xff09;使用例 1、Date类与Time类显示写 2、Date类与Time类写一部分 &#xff08;三&#xff09;总结 &#xff08;四&#xff09;初始化顺序小题目 二、类型转化 &#xff…

Linux Redis查询key与移除日常操作

维护老项目Express node 编写的后端程序、有这么一个方法、没有设置redis过期时间&#xff08;建议设置过期时间&#xff0c;毕竟登录生产服务器并不是每个人都有权限登录的&#xff01;&#xff01;&#xff01;&#xff09;。如果变动只能通过登录生产服务器、手动修改… 于…