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

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级,nginx配置跨域

文章目录

  • 1. 前置知识
  • 2. 原理和解决方案总结
    • 2.1. 跨域不通过原理流程图
    • 2.2. 实现原理:添加以下http响应头
    • 2.3. 四种跨域实现方式及优先级(从高到低)
  • 3. 具体实现代码
    • 3.1. 跨域全局配置方式-Filter(全适用)
    • 3.2. 跨域全局配置方式-SpringMvc
    • 3.3. 跨域单个配置方式-WebServlet
    • 3.4. 跨域单个配置方式-SpringMvc
  • 4.非java实现方式
    • 4.1. nginx代理
  • 9. 参考文章

1. 前置知识

  1. 【尚硅谷】【视频】【B站】禹神:一小时彻底搞懂跨域&解决方案
  2. 【尚硅谷】【笔记】【CSDN】禹神:彻底搞懂前端跨域&解决方案

2. 原理和解决方案总结

2.1. 跨域不通过原理流程图

跨域不通过原理流程图

2.2. 实现原理:添加以下http响应头

序号响应头含义
1Access-Control-Allow-Origin允许的源
2Access-Control-Allow-Methods允许的方法
3Access-Control-Allow-Headers允许的自定义头
4Access-Control-Max-Age预检请求的结果缓存时间(可选)

跨域解决方案原理

2.3. 四种跨域实现方式及优先级(从高到低)

  1. 跨域全局配置方式-Filter(全适用): 重写 Filter.doFilter(),设置 res.setHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数
  2. 跨域全局配置方式-SpringMvc : 重写 WebMvcConfigurer.addCorsMappings(),设置 registry.addMapping(“/**”).allowedOrigins(“*”)等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
  3. 跨域单个配置方式-WebServlet: 设置 res.addHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数
  4. 跨域单个配置方式-SpringMvc : 添加 @CrossOrigin注解,设置origins等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)

3. 具体实现代码

  • gitee源码

3.1. 跨域全局配置方式-Filter(全适用)

  • 重写Filter.doFilter(),设置 res.setHeader("Access-Control-Allow-Origin", "*") 等响应头参数
/** 1.跨域全局配置方式-Filter(全适用) */
@Configuration
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletResponse res = (HttpServletResponse) response;res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));                                  //【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。// 如果是复杂请求的预检请求(判断逻辑同SpringMvc),设置以下响应头,且没必要执行其它过滤器链 chain.doFilter(request, response);if (req.getMethod().equalsIgnoreCase("OPTIONS") && !ObjUtil.hasNull(req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"))) {res.setHeader("Access-Control-Allow-Methods", req.getHeader("Access-Control-Request-Method"));      //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers"));     //【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Max-Age", "5");                                                       //【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】return;}}
}

3.2. 跨域全局配置方式-SpringMvc

  • 重写 WebMvcConfigurer.addCorsMappings(),设置 registry.addMapping(“/**”).allowedOrigins(“*”)等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
/** 2.跨域全局配置方式-SpringMvc */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")      // 适配@RequestMapping。 (例如:/ajax/** 开头的)// 下面几个参数,不配置,会使用默认值。origins 和 originPatterns取并集.allowedOrigins("*")                    //【跨域配置】[必需]               允许请求源:默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", ).allowedOriginPatterns("*")             //【跨域配置】[必需]               允许请求源:默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", ).allowedMethods("*")                    //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值为GET,POST,HEAD。相当于res.setHeader("Access-Control-Allow-Methods", ).allowedHeaders("*")                    //【跨域配置】[有复杂请求头时必需]    允许请求头 :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Headers", ).maxAge(1800);                          //【跨域配置】[非必需]             预检缓存时长:默认值 1800秒。小于等于0时缓存无效【注意浏览器不要禁用缓存,否则不生效】。相当于res.setHeader("Access-Control-Max-Age", )}
}

3.3. 跨域单个配置方式-WebServlet

  • 设置 res.addHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数

/** 3.跨域单个配置方式-WebServlet */
@Slf4j
@WebServlet(name = "ajax", value = {"/ajax/WebServlet", "/ajax/WebServlet/"})
public class AjaxWebServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws IOException {log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));res.setHeader("Access-Control-Allow-Origin", "*");      //【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。res.setHeader("Access-Control-Allow-Methods", "*");     //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Allow-Headers", "*");     //【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Max-Age", "1800");        //【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】res.getWriter().write(DateUtil.now() + "@" + req.getMethod());}
}

3.4. 跨域单个配置方式-SpringMvc

  • 添加 @CrossOrigin注解,设置origins等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
/* 4.跨域单个配置方式-SpringMvc */
@Slf4j
@RestController
@RequestMapping("/ajax")
public class AjaxController {@CrossOrigin(// origins 和 originPatterns取并集。【注意】此处配置与下面的res.setHeader()功能相同,优先级较低。二选其一即可origins = {"*"},            //【跨域配置】[必需]               允许请求源  :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )originPatterns = {"*"},     //【跨域配置】[必需]               允许请求源  :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )methods = {},               //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值为(优先以@RequestMapping的method属性为准,如果没有指定则默认为"GET,POST,HEAD)。相当于res.setHeader("Access-Control-Allow-Methods", )allowedHeaders = {"*"},     //【跨域配置】[有复杂请求头时必需]    允许请求头 :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Headers", )maxAge = 1800               //【跨域配置】[非必需]             预检缓存时长:默认值 1800秒。小于等于0时缓存无效【注意浏览器不要禁用缓存,否则不生效】 。相当于res.setHeader("Access-Control-Max-Age", ))@RequestMapping(value = "/CrossOrigin", method = {RequestMethod.GET, RequestMethod.PUT})@SneakyThrowsvoid ajax(HttpServletRequest req, HttpServletResponse res) {log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));res.getWriter().write(DateUtil.now() + "@" + req.getMethod());}
}

4.非java实现方式

4.1. nginx代理

  • 优点:不用侵入java代码
  1. 配置nginx反向代理。在配置文件nginx.confhttp中添加一个server
  2. AJAX请求通过nginx转发。本例中,将AJAX请求发给58080端口,然后转发给8080端口
server {listen      58080;server_name localhost;location / {proxy_pass http://localhost:8080;# 增加响应头add_header       Access-Control-Allow-Origin  "*";          # 【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。if ($request_method = 'OPTIONS') {          # 如果是复杂请求的预检请求(参考SpringMvc,最好同时判断请求头OriginAccess-Control-Request-Method都不为null,略),设置以下响应头,且没必要透传,直接返回add_header   Access-Control-Allow-Origin  "*";          # 【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。add_header   Access-Control-Allow-Methods "*";          # 【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有add_header   Access-Control-Allow-Headers "*";          # 【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有add_header   Access-Control-Max-Age "5";                # 【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】return 204;}}
}

9. 参考文章

  • @CrossOrigin详细参数说明
  • SpringBoot处理跨域请求的四种方法

相关文章:

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级,nginx配置跨域

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理:添加以下http响应头2.3. 四种跨域实现方式及优先级(从高到低) 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…...

深入理解JavaScript性能优化:从基础到高级

引言 在当今快速发展的Web世界中,性能已经成为衡量应用质量的关键指标。随着Web应用复杂度的不断提升,JavaScript作为前端开发的核心语言,其性能优化变得尤为重要。本文旨在全面深入地探讨JavaScript性能优化的各个方面,从基础概念到高级技巧,帮助开发者构建高效、流畅的Web应用…...

java+springboot实现定时任务

由于是初级程序员,基于注解的形式实现了一个简单的定时任务; 1. 使用Scheduled注解 Spring的Scheduled注解是一种非常简单和便捷的实现定时任务的方式。通过在方法上添加Scheduled注解,我们可以指定方法在特定的时间间隔或固定的时间点执行…...

1.3 数据库的发展历史与演变

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

The field file exceeds its maximum permitted size of 1048576 bytes

场景: 再系统后台上传解析对账文件时大小超过1M就会报错 分析: 排查错误时了解MultipartFile默认上传大小就是1M,但是发现项目配置文件配置了上传大小100M,但是这个大小没有生效 因为项目启动并没有使用到这个配置大小并把他应用到file配置里面,经过测试发现只需要增加配置…...

【Es】python es操作

表 因为es是集群所以es_hosts是列表 from elasticsearch import Elasticsearch ES_HOSTS ["127.0.0.1:9200"] ES_HTTP_AUTH "******************"# 连接Es es Elasticsearch(hostsES_HOSTS ,http_authES_HTTP_AUTH ,maxsize60,timeout30,max_retries3…...

吃透前端文件上传与文件相关操作 多文件上传 大文件切片上传 拖拽上传 后续还会更新 断点续传等等

最近在学文件上传的操作,所以想把学习到东西写成一文章 这片文章是我以小白视角 慢慢学习并熟悉前端文件相关操作的流程总结出来的 前端文件上传 我首先想到是 <input type"file">**选择文件**</input>如果我们想限制上传文件的格式,大小或进行裁剪分片…...

用python制作88键赛博钢琴(能用鼠标键盘进行弹奏)

用python制作88键赛博钢琴 前言 恭喜这位博主终于想起了自己的账号密码&#xff01; 时光荏苒&#xff0c;转眼间已逾一年未曾在此留下墨香。尽管这一年间&#xff0c;博主投身于无尽的忙碌与挑战之中&#xff0c;但令人欣慰的是&#xff0c;那份初心与热情似乎并未因岁月的流…...

zdpgo_gin_login 框架20240815更新,增加注册路由的功能,一个方法自动拥有注册和登录两个API接口

zdpgo_gin_login 适配gin框架的登录注册功能组件&#xff0c;通过本框架轻松拥有登录注册相关的API接口 特性&#xff1a; 自动生成注册接口&#xff0c;具备密码加密的功能自动生成登录接口&#xff0c;具备JWT Token生成的功能 安装 go get github.com/zhangdapeng520/z…...

搭配Intel第13代酷睿处理器

高性能内存硬盘这么买 intel第13代酷睿已经于2022年10月底正式上市。相比于第12代酷睿性能大涨,内置20条PCle通道(16条PCle 5.0和4条PCle 4.0)、可最多支持128GB DDR5 5600/DDR4 3200双通道内存,搭配Z790系列主板组建高端性能平台,满足未来设计、游戏、专业应用等需求。如…...

uniapp快速回顾,新学websocket连接和BLE连接

Uni APP的学习 官方文档 uni-app官网 (dcloud.net.cn) 任何的博客都不如官方文档 一、快速复习 文件结构 main.js 功能&#xff1a;项目的入口文件&#xff0c;初始化 Vue 实例。 App.vue功能&#xff1a;根组件&#xff0c;包含应用的基本结构和全局样式。 manifest.js…...

激光测距传感器

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、产品原理&#xff1a;二、产品介绍&#xff1a;三、应用特点四、应用案例&#xff1a;1.冶金钢铁板卷材开卷工…...

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展&#xff0c;正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决&#xff0c;但这并不能阻挡历史趋势的车轮滚滚向前&#xff0c;AI 正在为工业领域带来新的变革。今天&#xff0c;我们特邀了上海腾展长融董事 &…...

讲讲android art虚拟机的内存

Android 的 ART&#xff08;Android Runtime&#xff09;虚拟机的内存管理是一个复杂但重要的部分。 ART 虚拟机的内存主要包括以下几个关键区域&#xff1a; Java 堆&#xff08;Java Heap&#xff09;&#xff1a; 这是存储 Java 对象实例的主要区域。堆内存被进一步划分为不…...

构建高效社群生态:探索社群系统的力量与未来

在数字化时代的大潮中&#xff0c;社群系统作为连接人与人、促进信息交流与资源共享的重要平台&#xff0c;正日益成为企业、组织乃至个人不可或缺的一部分。它不仅为成员提供了展示自我、学习成长的舞台&#xff0c;更为社群管理者创造了高效管理、精准运营的工具。今天&#…...

数据结构——排序(3):交换排序(续)

目录 一、快速排序 (1)hoare版本 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;2&#xff09;挖坑法 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;3&#xff09;lomuto前后指针 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代…...

2024最新版本Python安装及开发环境配置(vscodepython)

python安装 去Python官网下载最新版本&#xff1a; 接下来请一步步按照图片操作&#xff1a; 这样子就安装完成了 测试Python安装是否成功 先打开终端 右键Windows徽标&#xff0c;点击终端 然后输入python&#xff0c;如果如下图所示&#xff0c;就说明安装成功&#xff0…...

机器学习的定义

机器学习 机器学习的定义 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进&#xff0c;而无需进行明确的编程。机器学习算法分析和解释数据&#xff0c;然后使用该数据来做出预测或决策&#xff0c;随着时间的推移&#xff0c;它们会变得更加准…...

2024-08-05升级问题:Android中ScrollView嵌套listview并解决listview显示问题

问题&#xff1a; 当ScrollView嵌套ListView时&#xff0c;ListView的高度设置为wrap_content时出现ListView的高度不能完全展开&#xff0c;而只显示的第一个Item。 解决方法&#xff1a; 按item的个数乘以高度计算出listview的总高度&#xff0c;并在数据变化时直接设置lis…...

【热度文章】Java设计模式之中介者模 式

ava 中的中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过一个中介对象来封装一系列对象之间的交互&#xff0c;使这些对象之间不需要显式地相互引用&#xff0c;从而降低了对象之间的耦合度。 中介者模式的主要角色&…...

Jetson Orin Nano 升级jetpack5.1.2刷机过程记录

一.刷机起因 orin nano 接了个IMX477的摄像头,用 命令行DISPLAY:0.0 nvgstcapture-1.0 显示的画面有撕裂,让卖家查问题,卖家测试没有撕裂,对比环境,orin nano出厂默认的是jetpack5.1.1,卖家用的jetpack5.1.2版本,为了解决差异,要升级jetpack版本,前后搞了2天半,记录一下. 另外…...

隧道裂缝剥落病害AI识别系统

我国现有公路隧道超2.5万座&#xff0c;总里程超2.8万公里&#xff0c;其中运营超过15年的老旧隧道占比达35%。据交通运输部2025年统计&#xff0c;年均因隧道结构病害导致的交通中断超1200次&#xff0c;直接经济损失超45亿元。传统检测模式暴露四大核心痛点&#xff1a;检测周…...

Veo 2提示词效能跃迁实战(工业级Prompt链构建全图谱)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Veo 2提示词编写的核心范式演进 Veo 2作为新一代视频生成模型&#xff0c;其提示词&#xff08;prompt&#xff09;工程已从早期的“关键词堆叠”转向结构化、语义分层与意图对齐的复合范式。这一演进并非简…...

DeepSeek代码质量评估实战手册:7步完成从混沌到可度量的质变跃迁

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek代码质量评估的底层逻辑与核心价值 DeepSeek代码质量评估并非简单地统计行数或检测语法错误&#xff0c;而是基于多维语义理解构建的推理系统。其底层逻辑融合了静态分析、符号执行与大语言模型生成式…...

Goframe项目实战:从数据库表到API接口的全链路开发指南(含避坑点)

Goframe项目实战&#xff1a;从数据库表到API接口的全链路开发指南&#xff08;含避坑点&#xff09;在当今微服务架构盛行的时代&#xff0c;Go语言因其高性能和并发优势成为后端开发的热门选择。而Goframe作为一款企业级的Go应用开发框架&#xff0c;提供了从数据库操作到API…...

ThinkPad开机报错0183/0253?别慌,手把手教你搞定EFI变量错误(附BIOS重置教程)

ThinkPad开机报错0183/0253&#xff1f;EFI变量错误全面解决方案当你按下ThinkPad的电源键&#xff0c;期待熟悉的开机画面时&#xff0c;屏幕上却突然跳出一串神秘代码——"0183: Bad CRC of Security Settings in EFI Variable"或"0253: EFI Variable Block D…...

Unity发行版DLL调试实战:DnSpy无源码IL级断点指南

1. 这不是“反编译”&#xff0c;而是Unity游戏开发者的日常调试手段你有没有遇到过这样的情况&#xff1a;接手一个Unity发行版游戏&#xff0c;想快速验证某个功能逻辑是否按预期执行&#xff0c;或者排查一个偶发的崩溃&#xff0c;但手头只有打包后的Assembly-CSharp.dll&a…...

Owl-Alpha 新手快速上手指南

在处理大规模数据或构建高性能应用时&#xff0c;我们常常会遇到一个棘手的问题&#xff1a;如何在不阻塞主线程的情况下&#xff0c;高效地执行耗时任务&#xff1f;无论是处理图像、解析大型文件&#xff0c;还是进行复杂的数学运算&#xff0c;传统的单线程模式往往会让界面…...

为Claude Code配置稳定API源并解决访问限制

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置稳定API源并解决访问限制 Claude Code 作为一款强大的 AI 编程辅助工具&#xff0c;其原生服务在某些情况下可能…...

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战&#xff1a;零基础打造自定义键盘鼠标 手里那块吃灰的ESP32开发板终于能派上用场了&#xff01;上周我用它做了个无线演示控制器&#xff0c;在会议室里走着就能翻PPT&#xff0c;同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB…...