Springboot常见跨域解决方案

1、使用@CrossOrigin注解实现跨域【局域类跨域】
此注解既可以修饰类,也可以修饰方法。当修饰类时,表示此类中的所有接口都可以跨域;当修饰方法时,表示此方法可以跨域,使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;@RestController
@CrossOrigin(origins = "*")
public class TestController {@RequestMapping("/test")public HashMap<String, Object> test() {return new HashMap<String, Object>() {{put("state", 200);put("data", "success");put("msg", "");}};}
}


2、通过配置文件实现跨域【全局跨域】
创建配置类(@Configuration注解的类),实现WebMvcConfigurer接口,重写addCorsMappings方法,设置允许跨域的代码。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") //所有接口.allowCredentials(true) //是否发送 Cookie.allowedOriginPatterns("*") //支持域.allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) //支持的方法.allowedHeaders("*").exposedHeaders("*");}
}


3、通过CorsFilter对象实现跨域【全局跨域】
同样创建配置类(@Configuration注解的类),构造CorsFilter的bean。

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;@Configuration
public class MyCorsFilter {@Beanpublic CorsFilter corsFilter() {//创建 CORS 配置对象CorsConfiguration config = new CorsConfiguration();//支持域config.addAllowedOriginPattern("*");//是否发送 Cookieconfig.setAllowCredentials(true);//支持请求方式config.addAllowedMethod("*");//允许的原始请求头部信息config.addAllowedHeader("*");//暴露的头部信息config.addExposedHeader("*");//添加地址映射UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/**", config);//返回 CorsFilter 对象return new CorsFilter(corsConfigurationSource);}
}


4、通过Response对象实现跨域【局域方法跨域】
此方式是解决跨域问题最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它应用的范围最小,设置的是方法级别的跨域。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;@RestController
public class TestController {@RequestMapping("/test")public HashMap<String, Object> test(HttpServletResponse response) {// 设置跨域response.setHeader("Access-Control-Allow-Origin", "*");return new HashMap<String, Object>() {{put("state", 200);put("data", "success");put("msg", "");}};}
}


5、通过实现 ResponseBodyAdvice 实现跨域【全局跨域】
重写 ResponseBodyAdvice 接口中的 beforeBodyWrite(返回之前重写)方法,此实现方式也是全局跨域,它对整个项目中的所有接口有效。

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {/*** 内容是否需要重写(通过此方法可以选择性部分控制器和方法进行重写)* 返回true表示重写*/@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}/*** 方法返回之前调用此方法*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {// 设置跨域response.getHeaders().set("Access-Control-Allow-Origin", "*");return body;}
}


6、SpringCloud Gateway中解决跨域
6.1、在 application.yml 或 application.properties 中添加以下配置

spring:cloud:gateway:globalcors:corsConfigurations:'[/**]': #这里的'/**'表示对所有路由生效,可以根据需要调整为特定路径allowedOrigins: "*" #允许所有的源地址,也可以指定具体的域名allowedMethods: #允许的 HTTP 方法类型- GET- POST- PUT- DELETE- OPTIONSallowedHeaders: "*" #允许所有的请求头,也可以指定具体的请求头allowCredentials: true #是否允许携带凭证(cookies)maxAge: 3600 #CORS预检请求的有效期(秒)

6.2、添加 CorsWebFilter 来解决跨域问题
Spring-Framework 5.3 版本之前

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();//配置为放行所有域名,生产环境请对此进行修改config.addAllowedOrigin("*");//放行的请求头config.addAllowedHeader("*");//放行的请求类型,有GET,POST,PUT,DELETE,OPTIONSconfig.addAllowedMethod("*"); //暴露头部信息config.addExposedHeader("*"); //是否允许发送Cookieconfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

Spring-Framework 5.3 版本之后

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration config = new CorsConfiguration();//配置为放行所有域名,生产环境请对此进行修改config.addAllowedOriginPattern("*");//放行的请求头config.addAllowedHeader("*");//放行的请求类型,有GET,POST,PUT,DELETE,OPTIONSconfig.addAllowedMethod("*"); //暴露头部信息config.addExposedHeader("*"); //是否允许发送Cookieconfig.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

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

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

相关文章

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码&#xff08;适用于spring cloud gateway&#xff09;1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…

华为认证 | HCIE云计算考试难度大吗?

HCIE认证考试对考生的技术要求非常高&#xff0c;涉及云计算的各个方面&#xff0c;包括但不限于虚拟化、存储、网络、安全等。 许多人对HCIE认证的难度和费用存在疑问&#xff0c;下面将为您详细解析。 01 HCIE云计算考试难度大吗&#xff1f; 首先&#xff0c;我们来看看HCI…

C++基础语法学习笔记

C Tutorial 1.基础语法 C 应用&#xff1a;操作系统、图形用户界面和嵌入式系统 C和C区别&#xff1a;C支持类和对象 C语法 #include <iostream> using namespace std;int main(){cout << "hello world!";return 0; }int main () { cout << &q…

今日分享个三级联动

js代码 let xhr new XMLHttpRequest(); // 创建一个新的XMLHttpRequest对象&#xff0c;命名为xhr。用来请求接口&#xff0c;处理异步操作&#xff1b; // 这个对象用于在浏览器和服务器之间发送 HTTP 请求和接收响应。 xhr.open(get, js/index.json, true); // 打开一个新的…

8-Docker网络模式之container

1.介绍 Docker container网络模式是指指定新创建的Docker容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 使用Docker container网络模式新建的容器不会创建的自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口等。然而两个容器除了网络…

知识图谱推理方法综述

目录 前言1 基于符号表示的推理方法1.1 Axioms和Datalog1.2 图结构和规则学习1.3 TBox和ABox 2 基于向量表示的推理方法2.1 嵌入系列和Ontology Embedding2.2 向量的规则学习2.3 图神经网络 3 符号逻辑和表示学习的融合3.1 向量表示学习与本体规则学习3.2 规则演绎推理3.3 符号…

Oracle闪回日志管理(flashbackup log)

Oracle闪回日志管理&#xff08;flashbackup log&#xff09; 1.开启闪回日志 shutdown immediate startup mount; alter database archivelog; alter database flashback on; alter database open; 2、查看闪回日志保留期限 show parameter flash 默认是1440分钟&#xff0c…

Android Mac电脑更改aar中的文件再打包

一 问题 要在Mac电脑上替换AAR中的文件并重新打包。 二 解决方案 1.解压AAR文件 将AAR文件重命名为.zip&#xff0c;并解压缩它&#xff0c;得到一个文件夹。 2.替换文件 在解压后的文件夹中找到您想替换的文件&#xff0c;将其替换为新文件。 3.重新打包 打开终端&…

软件工程知识梳理4-详细设计

详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统&#xff0c;也就是说.经过这个阶段的设计工作.应该得出对目标系统的精确描述.从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。 详细设计的的目标不仅仅是逻辑上正确地实现每个模块地功能&a…

java之手动创建spring-boot-3项目

手动创建 基于springboot3 正确配置maven的前提下&#xff0c;创建一个空的项目 复制下面的pom文件&#xff0c;使用maven下载依赖即可 前提是maven配置的没问题 pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

手机屏幕生产厂污废水处理需要哪些工艺设备

随着手机行业的快速发展&#xff0c;手机屏幕生产厂的规模也越来越大&#xff0c;但同时也带来了大量的污废水排放问题。为了保护环境和人类的健康&#xff0c;手机屏幕生产厂需要采取适当的工艺设备来处理污废水。本文将介绍手机屏幕生产厂污废水处理所需的工艺设备。 首先&am…

计算机速成课Crash Course - 27. 3D 图形

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 27. 3D 图形 (qq.com) 27. 3D 图形 在过去五集&#xff0c;我们从基于…

Wireshark网络协议分析 - Wireshark速览

在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获&#xff08;Capture&#xff09;2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…

npm i 遇到了 npm ERR! code CERT_HAS_EXPIRED

npm i 遇到了 npm ERR! code CERT_HAS_EXPIRED 更新你的系统时间【命令 date】。确保你的计算机上的时间和时区设置正确&#xff0c;并且与当前时间相符。 清除你的 npm 缓存。使用 npm cache clean --force 命令清除你的 npm 缓存&#xff0c;关闭ssl验证&#xff0c;并重新运…

Python+Selenium+Unittest 之selenium15--等待时间

在正常的自动化过程中&#xff0c;如果整篇代码中没有加等待时间的话&#xff0c;有时候可能页面跳转或者还没开始点击就执行到下一个流程了&#xff0c;这时候因为页面没有加载完毕&#xff0c;所以有可能会导致找不到对应的元素而报错&#xff0c;因此我们需要在整个代码流程…

AlmaLinux上安装Docker

AlmaLinux上安装Docker 文章目录 AlmaLinux上安装Docker一、前言二、具体步骤1、Docker 下载更新系统包索引&#xff1a;添加Docker仓库&#xff1a;安装Docker引擎&#xff1a; 2、Docker服务启动启动Docker服务&#xff1a;设置Docker开机自启&#xff1a; 3、Docker 安装验证…

Android开发--ProgressBar应用显示测点数量

1.自定义ProgressBarView public class ProgressBarView extends View {private Paint mPaintBack;private Paint mPaint;private Paint mPaintText;private float process;int strokeWidth 3;//圈宽度int textSize 17;//字大小private long duration 1000;private float st…

一站式在线APP封装平台的革新之旅

随着移动互联网的快速发展&#xff0c;App已经成为我们日常生活中不可或缺的一部分。对于开发者而言&#xff0c;将创新的应用快速打包成APK格式&#xff0c;并进行有效分发&#xff0c;是确保应用生命周期成功的关键一步。传统的App打包过程往往需要复杂的环境配置、依赖管理以…

扩展学习|大数据分析整合到价值创造的大见解

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/14IGaCOc-plxAiaVhwOgUvA 提取码…

Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导

文章目录 1. 背景基础知识1.1 什么是状态空间模型&#xff08;State Space Model&#xff0c;SSM&#xff09;&#xff1f;1.2 什么是离散化&#xff08;Discretization&#xff09;&#xff1f;1.3 为什么需要离散化&#xff1f; 2. SSM离散化过程推导2.1 为什么在离散化过程中…