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

SpringBoot工具库:解决SpringBoot2.*版本跨域问题

1.解决问题:When allowCredentials is true, xxxxxxx , using “allowedOriginPatterns“ instead

2.3版本跨域配置如下

/*** 跨域问题解决*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*").maxAge(3600).allowCredentials(true);}
}

1.1.解决方法:

        Spring官网有类似问题:https://github.com/spring-projects/spring-framework/issues/26111

        大致意思为:提供了allowedOriginPatterns方法供使用。原本的allowCredentials为true时,allowedOrigins不能使用 * 号匹配

/*** 跨域问题解决*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("*").allowedHeaders("*").maxAge(3600).allowCredentials(true);}
}

其实解决跨域大分类有2种方式,一种是利用注解,一种写个配置类 

2.解决跨域的几种方式

2.1.CorsFilter 方式设置跨域

        CorsFilter过滤器:通过Spring Boot的CORS过滤器来处理跨域请求,需要定义一个CorsFilter Bean,例如:

@Configuration
public class CoreFilter {@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.addAllowedOriginPattern("*");  // 不是 addAllowedOriginconfig.setAllowCredentials(true);config.addAllowedHeader("*");config.addAllowedMethod("*");source.registerCorsConfiguration("/**", config);FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));bean.setOrder(Ordered.HIGHEST_PRECEDENCE);return new CorsFilter(source);}
}

2.2.拦截器实现跨域

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.io.Serializable;@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer, Serializable {private static final long serialVersionUID = 1L;@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")// 不是 addAllowedOrigin.allowedOriginPatterns("*").allowedMethods("*").allowedHeaders("*").maxAge(3600).allowCredentials(true);}/*** 修改访问路径* @param configurer*/public void configurePathMatch(PathMatchConfigurer configurer) {// 设置为true后,访问路径后加/ 也能正常访问  /user == /user/configurer.setUseTrailingSlashMatch(true);}}

        与使用 CorsFilter 方式一样,当 allowCredentials 为 true时,不可以将 allowedOrigins 设置为 *,必须用 allowedOriginPatterns。否则最终也会到 CorsConfiguration#validateAllowCredentials 方法中的校验。

2.3.通过 @CrossOrigin 实现跨域

@CrossOrigin 可以标注类和单个方法。使用@CrossOrigin注解标注在Controller类或方法上,指定允许跨域的源地址、请求方法、Header等属性

标注类:

该 Controller 请求路径下的所有方法都允许跨域。

@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@RequestMapping(method = RequestMethod.GET, path = "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

        在类级别上添加了 @CrossOrigin。因此,retrieve() 和 remove() 方法都启用了 @CrossOrigin。我们可以通过指定以下注解属性的值来自定义配置:originsmethodsallowedHeadersexposedHeadersallowCredentials 或 maxAge

标注方法:

仅标注的方法允许跨域。

@RestController
@RequestMapping("/account")
public class AccountController {@CrossOrigin@RequestMapping(method = RequestMethod.GET, path = "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

在上面的示例中,我们只为 retrieve() 方法启用了 CORS。我们可以看到,我们没有为 @CrossOrigin 注解设置任何配置,因此它使用的是默认值:

  • 允许所有 origin。
  • 允许使用的 HTTP 方法是 @RequestMapping 注解(本例中为 GET)中指定的方法。
  • 缓存预检响应的时间(maxAge)为 30 分钟。

在类上和方法上

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@CrossOrigin("http://example.com")@RequestMapping(method = RequestMethod.GET, "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

Spring 将合并两个注解的属性,创建合并的 CORS 配置。

这里,两个方法的 maxAge 都是 3600 秒,remove() 方法允许所有 origin,而 retrieve() 方法只允许来自 http://example.com 的 origin。

2.4.nginx

Nginx反向代理:将请求转发给Nginx,由Nginx统一处理跨域请求,例如:

location /api/ {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}proxy_pass http://localhost:8080;
}

2.5.webFilter

使用@WebFilter注解:该注解可以直接在过滤器类上使用,并指定过滤的url,类似于xml文件中配置的filter

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;@Component
@WebFilter(urlPatterns = "/*")
@Order(-99999)
public class CorsFilter extends HttpFilter {private static final long serialVersionUID = 2386571986045107652L;private static final String OPTIONS_METHOD = "OPTIONS";@Overrideprotected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {String origin = req.getHeader(HttpHeaders.ORIGIN);if (!StringUtils.isEmpty(origin)) {// 允许客户端的域res.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);// 允许客户端提交的HeaderString requestHeaders = req.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS);if (!StringUtils.isEmpty(requestHeaders)) {res.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders);}// 允许客户端访问的Headerres.addHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");// 允许客户端携带凭证信息res.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");// 允许客户端请求方法res.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, OPTIONS, DELETE");if (OPTIONS_METHOD.equalsIgnoreCase(req.getMethod())) {res.setStatus(HttpServletResponse.SC_NO_CONTENT);res.setContentType(MediaType.TEXT_HTML_VALUE);res.setCharacterEncoding("utf-8");res.setContentLength(0);res.addHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE, "1800");return;}}super.doFilter(req, res, chain);}
}

相关文章:

SpringBoot工具库:解决SpringBoot2.*版本跨域问题

1.解决问题&#xff1a;When allowCredentials is true, xxxxxxx , using “allowedOriginPatterns“ instead 2.3版本跨域配置如下 /*** 跨域问题解决*/ Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegi…...

docker安装开发常用软件MySQL,Redis,rabbitMQ

Docker安装 docker官网&#xff1a;Docker: Accelerated Container Application Development docker镜像仓库&#xff1a;https://hub.docker.com/search?qnginx 官网的安装教程&#xff1a;Install Docker Engine on CentOS | Docker Docs 安装步骤 1、卸载以前安装的doc…...

C# Unity FSM 状态机

C# Unity FSM 状态机 使用状态机可以降低代码耦合性&#xff0c;并且可以优化代码可读性&#xff0c;方便团队协作等。 对于游戏开发内容来讲游戏开发的流程控制玩家动画都可以使用FSM有限状态机来实现。 1.FsmState 每个状态的基类&#xff0c;泛型参数表示所拥有者 publi…...

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来&#xff0c;前辈们用caffe搭建了一个squeezenet的工程&#xff0c;用起来也还行&#xff0c;但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说&#xff0c;主要就是pyorch&#xff0c;其余的需要什么p…...

【精读Uboot】SPL阶段的board_init_r详细分析

对于i.MX平台上的SPL来说&#xff0c;其不会直接跳转到Uboot&#xff0c;而是在SPL阶段借助BOOTROM跳转到ATF&#xff0c;然后再通过ATF跳转到Uboot。 board_init_f会初始化设备相关的硬件&#xff0c;最后进入board_init_r为镜像跳转做准备。下面是board_init_r调用的核心函数…...

canvas绘制渐变色三角形金字塔

项目需求:需要绘制渐变色三角形金字塔,并用折线添加标识 (其实所有直接用图片放上去也行,但是ui没切图,我也懒得找她要,正好也没啥事,直接自己用代码绘制算了,总结一句就是闲的) 最终效果如下图: (以上没用任何图片,都是代码绘制的) 在网上找了,有用canvas绘…...

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

Debain JDK8 安装

Debain JDK8 安装 首先请安装依赖&#xff1a; sudo apt-get update && sudo apt-get install -y wget apt-transport-https然后信任 GPG 公钥&#xff1a; wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/…...

Python序列操作指南:列表、字符串和元组的基本用法和操作

文章目录 序列列表创建列表访问元素修改元素添加和删除元素 range()字符串创建字符串访问字符字符串切片修改字符串 元组创建元组访问元素获取元素数量元组的特点&#xff1a; 可变对象改变对象的值改变变量的指向比较运算符总结 python精品专栏推荐python基础知识&#xff08;…...

【已更新代码图表】2023数学建模国赛E题python代码--黄河水沙监测数据分析

E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c;以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位于小浪底水…...

【前端】CSS-Grid网格布局

目录 一、grid布局是什么二、grid布局的属性三、容器属性1、display①、语句②、属性值 2、grid-template-columns属性、grid-template-rows属性①、定义②、属性值1&#xff09;、固定的列宽和行高2&#xff09;、repeat()函数3&#xff09;、auto-fill关键字4&#xff09;、f…...

计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

2023-9-8 求组合数(二)

题目链接&#xff1a;求组合数 II #include <iostream> #include <algorithm>using namespace std;typedef long long LL; const int mod 1e9 7; const int N 100010;// 阶乘&#xff0c;阶乘的逆 int fact[N], infact[N];LL qmi(int a, int k, int p) {int res…...

k8s service的一些特性

文章目录 Service分发负载的策略同一端口通过不同协议暴露Headless Service的负载分发策略 Service分发负载的策略 大家都知道&#xff0c;一个service可以对应多个pod&#xff0c;那么一定要有一些方法来把service接收到的请求&#xff08;负载&#xff09;转发到pod上。 一般…...

C++中std::enable_if和SFINAE介绍

作为一个标准的C++模板类,我们先看下enable_if的定义: // STRUCT TEMPLATE enable_if template <bool _Test, class _Ty = void> struct enable_if {}; // no member "type" when !_Testtemplate <class _Ty> struct enable_if<true, _Ty> { //…...

华为OD机考算法题:数字加减游戏

目录 题目部分 解读与分析 代码实现 题目部分 题目数字加减游戏难度难题目说明小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字 s 变成数字 t 。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减…...

WPF命令

在设计良好的Windows应用程序中&#xff0c;应用程序逻辑不应位于事件处理程序中&#xff0c;而应在更高层的方法中编写代码。其中的每个方法都代表单独的应用程序任务。每个任务可能依赖其他库。 使用这种设计最明显的方式是在需要的地方添加事件处理程序&#xff0c;并使用各…...

Unity中Shader的屏幕抓取 GrabPass

文章目录 前言一、抓取1、抓取指令2、在使用抓取的屏幕前&#xff0c;需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的 前言 Unity中Shader的屏幕抓取 GrabPass 一、抓取 1、抓取指令 屏幕的抓取需要使用一个Pass GrabPass{} GrabPass{“NAME”} 2、在使用…...

手撕 队列

队列的基本概念 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 队列用链表实现 队列的实现 队列的定义 队列…...

【autodl/linux配环境心得:conda/本地配cuda,cudnn及pytorch心得】-未完成

linux配环境心得&#xff1a;conda/本地配cuda&#xff0c;cudnn及pytorch心得 我们服务器遇到的大多数找不到包的问题一&#xff0c;服务器安装cuda和cudnn使用conda在线安装cuda和cudnn使用conda进行本地安装检查conda安装的cuda和cudnn本地直接安装cuda和cudnn方法一&#x…...

Android BSP 开发修改轨迹

一、 Android BSP 整体开发修改轨迹图Android BSP 软件架构 │ ├── 【第1层&#xff1a;Bootloader 引导层】 │ ├── 1.1 一级引导程序&#xff08;Primary Bootloader&#xff09; │ │ ├── ROM Code&#xff08;芯片固化&#xff09; │ │ └── SPL /…...

突破限制与全版本支持:MediaCreationTool.bat重新定义Windows安装介质制作

突破限制与全版本支持&#xff1a;MediaCreationTool.bat重新定义Windows安装介质制作 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreatio…...

LeetCode 3418:机器人获取最大金币数(动态规划+状态压缩)

LeetCode 3418&#xff1a;机器人获取最大金币数&#xff08;动态规划状态压缩&#xff09; LeetCode 3418. 机器人可以获得的最大金币数【动态规划状态压缩】 问题描述 给定一个 m x n 的网格&#xff0c;机器人从左上角 (0, 0) 出发前往右下角 (m-1, n-1)&#xff0c;仅能向右…...

从BGA封装到Xtacking架构:图解NAND堆叠技术如何影响SSD性能

从BGA封装到Xtacking架构&#xff1a;NAND堆叠技术如何重塑SSD性能格局 当一块企业级SSD的读写速度突破7GB/s时&#xff0c;工程师们发现传统的NAND封装技术正在成为性能提升的瓶颈。在PCIe 5.0时代&#xff0c;信号传输速率需要达到2400MT/s才能充分发挥带宽潜力&#xff0c;而…...

2026企业AI落地必看:避开3大坑,让你的智能体真正帮你赚钱!收藏这份实战指南

本文深入探讨了企业AI智能体落地的现实难题&#xff0c;包括数据基础薄弱、单体智能体处理复杂流程能力不足以及人机协同缺失三大痛点。作者通过分析30企业案例&#xff0c;提出了针对性的解决方案&#xff1a;建立RAG架构和OCR数据清洗以夯实数据基础&#xff1b;采用多智能体…...

Claude Code助手对比:百川2-13B在代码生成与解释方面的能力展示

Claude Code助手对比&#xff1a;百川2-13B在代码生成与解释方面的能力展示 最近和几个做开发的朋友聊天&#xff0c;大家讨论最多的就是AI编程助手到底哪个更好用。Claude Code的名气确实很大&#xff0c;很多技术社区都在讨论它。不过&#xff0c;除了这些“明星”选手&…...

intv_ai_mk11开源可部署指南:下载镜像、启动服务、浏览器访问、安全注意事项全涵盖

intv_ai_mk11开源可部署指南&#xff1a;下载镜像、启动服务、浏览器访问、安全注意事项全涵盖 1. 项目概述 intv_ai_mk11是一款基于Llama架构的AI对话机器人&#xff0c;拥有7B参数规模&#xff0c;能够运行在GPU服务器上提供智能对话服务。这个开源项目可以帮助开发者快速部…...

一天一个开源项目(第61篇):knowledge_graph - 把任意文本转成知识图谱

引言 “Convert any text to a graph of knowledge. Graph Retrieval Augmented Generation (GRAG) — a new and improved version of RAG.” 这是「一天一个开源项目」系列的第 61 篇文章。今天介绍的项目是 knowledge_graph&#xff08;GitHub&#xff09;。 想把文档、PDF…...

别再被 CAD+GIS 折腾到崩溃!这款插件让你效率翻 10 倍,一键搞定所有地理信息处理

做测绘、规划、市政设计的你&#xff0c;是不是每天都在被这些问题折磨&#xff1f;CAD 里画好图&#xff0c;切到 GIS 软件导数据&#xff0c;反复切换动辄半小时&#xff1b;加载大型影像文件卡到死机&#xff0c;属性表管理杂乱无章&#xff1b;想把 GIS 属性标到图纸上&…...

亚马逊/Shopee关键词排名高就一定好?你可能陷入了“数据幻觉”

关键词排名高只说明“看得见”&#xff0c;不代表“卖得动”&#xff0c;更不等于“值得投”。理论锚点信息经济学信号噪音理论&#xff1a;排名只是表层信号&#xff0c;可能混杂品牌词截流等无关信息。SEO 搜索意图分类&#xff1a;信息型搜索不等于交易型搜索。一、误区揭露…...