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

news2024/11/26 11:02:59

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

简单请求条件
方法限制: 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 路径

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

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

相关文章

JAVA Maven 的安装与配置

一、下载地址 官方网站&#xff1a;Maven – Download Apache Maven 我这里是3.8.6版本 二、安装步骤 maven安装之前要先安装jdk&#xff0c;请确保你的系统已经安装了jdk环境。 1.将下载好的 Maven 进行解压 apache-maven-3.6.8-bin.zip 2.配置本地仓库:修改 conf/settin…

HDU RSA

翻译成中文后&#xff1a; 思路&#xff1a;由题易得&#xff0c;d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d &#xff0c;但要保证 d 是非负的&#xff0c;最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…

【Web前端概述】

HTML 是用来描述网页的一种语言&#xff0c;全称是 Hyper-Text Markup Language&#xff0c;即超文本标记语言。我们浏览网页时看到的文字、按钮、图片、视频等元素&#xff0c;它们都是通过 HTML 书写并通过浏览器来呈现的。 一、HTML简史 1991年10月&#xff1a;一个非正式…

第 6 章 Kafka-Eagle 监控 和 Kafka-Kraft 模式

Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况&#xff0c;在生产环境中经常使用。 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL &#xff0c; MySQL 主要用来存储可视化展示的数据。如果集 群中之前安装过 MySQL 可以跨过该步。 6.2 Kafka 环境准备 …

ELK日志分析系统部署

ELK日志分析系统 ELK指的是ElasticsearchLogstashKibana这种架构的缩写。 ELK是一种日志分析平台&#xff0c;在很早之前我们经常使用Shell三剑客&#xff08;一般泛指grep、sed、awk&#xff09;来进行日志分析&#xff0c;这种方式虽然也可以应对多种场景&#xff0c;但是当…

多线程初阶(七):单例模式指令重排序

目录 1. 单例模式 1.1 饿汉模式 1.2 懒汉模式 2. 懒汉模式下的问题 2.1 线程安全问题 2.2 如何解决 --- 加锁 2.3 加锁引入的新问题 --- 性能问题 2.4 指令重排序问题 2.4.1 指令重排序 2.4.2 指令重排序引发的问题 1. 单例模式 单例模式, 是设计模式中最典型的一种模…

CTFHUB技能树之SQL——MySQL结构

开启靶场&#xff0c;打开链接&#xff1a; 先判断一下是哪种类型的SQL注入&#xff1a; 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说明是整数型注入 判断一下字段数&#xff1a; 1 order by 2# 正常回显 1 order by 3# 回显错误&#xff0c;说明字段数是2列 知道…

未来医疗:大语言模型如何改变临床实践、研究和教育|文献精析·24-10-23

小罗碎碎念 这篇文章探讨了大型语言模型在医学领域的潜在应用和挑战&#xff0c;并讨论了它们在临床实践、医学研究和医学教育中的未来发展。 姓名单位名称&#xff08;中文&#xff09;Jan Clusmann德国德累斯顿工业大学埃尔朗根弗雷斯尼乌斯中心数字化健康研究所Jakob Nikola…

html 轮播图效果

轮播效果&#xff1a; 1、鼠标没有移入到banner,自动轮播 2、鼠标移入&#xff1a;取消自动轮播、移除开始自动轮播 3、点击指示点开始轮播到对应位置 4、点击前一个后一个按钮&#xff0c;轮播到上一个下一个图片 注意 最后一个图片无缝滚动&#xff0c;就是先克隆第一个图片…

动态量化:大模型在端侧CPU快速推理方案

作为一款高性能的推理引擎框架&#xff0c;MNN高度关注Transformer模型在移动端的部署并持续探索优化大模型在端侧的推理方案。本文介绍权重量化的模型在MNN CPU后端的推理方案&#xff1a;动态量化。动态量化指在运行时对浮点型feature map数据进行8bit量化&#xff0c;然后与…

(gersemi) CMake 格式化工具

文章目录 &#x1f9ee;介绍&#x1f9ee;安装&#x1f9ee;使用&#x1f5f3;️模式 modes&#x1f5f3;️样式配置 config ⭐END&#x1f31f;help&#x1f31f;交流方式 &#x1f9ee;介绍 BlankSpruce/gersemi: A formatter to make your CMake code the real treasure A f…

Leetcode 最长公共前缀

java solution class Solution {public String longestCommonPrefix(String[] strs) {if(strs null || strs.length 0) {return "";}//用第一个字符串作为模板,利用indexOf()方法匹配,由右至左逐渐缩短第一个字符串的长度String prefix strs[0];for(int i 1; i …

【Java】反射概述与详解

目录 引言 一、概述 二、获取Class对象 三、反射获取构造方法 代码示例&#xff1a; 四、反射获取成员变量 代码示例&#xff1a; 五、反射获取成员方法 代码示例&#xff1a; 结语 引言 Java中的反射&#xff08;Reflection&#xff09;是一种强大的机制&#…

热门的四款PDF合并工具大比拼!!!

在现代的数字化办公环境中&#xff0c;PDF文件已经成为了一种重要的文件格式&#xff0c;用于保存和共享各种类型的文档。然而&#xff0c;有时候我们需要将多个PDF文件合并成一个文件&#xff0c;这时候就离不开好用的PDF合并工具了。选择一个好的PDF合并工具是一个长期的投资…

Python基于OpenCV的实时疲劳检测

2.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间&#xff08;表示眨眼&#xff09;。 相反&#xff0c;眼睛长…

【Power Query】List.Select 筛选列表

List.Select 筛选列表 ——在列表中返回满足条件的元素 List.Select(列表,判断条件) 不是列表的可以转成列表再筛选&#xff0c;例如 Record.ToList 不同场景的判断条件参考写法 (1)单条件筛选 列表中小于50的数字 List.Select({1,99,8,98,5},each _<50) (2)多条件筛…

红黑树(Java数据结构)

前言&#xff1a; 红黑树的学习需要大家对二叉搜索树与AVL树有深刻的理解&#xff0c;如果话没有看过我对二叉搜索树与AVL树的讲解的铁子们可以先看看上一篇文章&#xff1a;二叉搜索树与AVL树(java数据结构)-CSDN博客 红黑树&#xff1a; 什么是红黑树&#xff1f; 红黑树&a…

CenterTrack算法详解

背景&#xff1a; 早期追踪器在缺乏强的低水平线索下&#xff0c;容易失败检测后跟踪的模型依赖于检测器&#xff0c;且需要一个单独的阶段匹配关联策略的时间长 简介&#xff1a; 基于点的跟踪思想&#xff0c;通过预测目标的中心点来进行跟踪&#xff0c;同时实现检测与跟…

LLM在Reranker任务上的最佳实践?A simple experiment report(with code)

知乎&#xff1a;车中草同学(已授权)链接&#xff1a;https://zhuanlan.zhihu.com/p/987727357 引言 在BERT时代&#xff0c;对于Reranker任务&#xff0c;我们使用encoder-only的BERT为基座&#xff0c;拼接query和doc输入到BERT中去&#xff0c;在使用CLS的向量通过一个MLP&a…

身份证识别JAVA+OPENCV+OCR

一、相关的地址 https://github.com/tesseract-ocr/tessdata Releases - OpenCV opencv要装好&#xff0c;我装的是4.5.3的&#xff0c;最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本&#xff0c;我试了一下报错&#xff0c;不知道是不是版本不支持…