热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新手对跨域的误解以及Credentials对跨域配置的坑

在学习过程中,跨域似乎很简单,无非就是“当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域”;无非就是“后端加

在学习过程中,跨域似乎很简单,无非就是“当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域”;
无非就是“后端加一下跨域的相关响应头即可”。

但是在前后联调过程中,发现跨域并没有那么容易解决。

后端环境是springboot,一开始用的重写WebMvcConfigurer里面的addCorsMappings,添加相应的响应头,但是发现无效。

百度一下猜测可能是因为过滤器链的顺序问题,因此单独写了一个Filter并将order设为较靠前的位置。

然而,设置的ACCESS_CONTROL_ALLOW_ORIGIN明明是“*”,但是前端得到的却是火狐的一个扩展(具体值我不记得了)。
(后面大概猜测到,由于我用的是火狐插件Rester进行的接口测试,因此origin自带为火狐扩展的专用默认值)

前端要求必须看到“*”号,于是上nginx反向代理,配置参考

但是,前端有多名人员,其中有人成功进行了跨域访问,还有个哥们一直跨域失败。
难道跨域配置在前端还做了什么拦截吗?

经过排查,那位跨域失败的兄弟发现将axios的所有config删除后就能正常访问了。

但是,按理来说,不可能为了跨域就不让用axios的config了,所以应该是其中的某个配置造成的问题,不过具体的原因那个前端没有跟我说,我也不大清楚。

本以为解决了,结果前端很快跟我说,get可以访问,post依旧存在跨域。

一环扣一环,于时又是一波折腾,中间的曲折过程就不说了。

最终发现:
Credentials设为 true之后,Access-Control-Allow-Origin就不能设置为 * 了!
因此需要将Credentials设为false,然后前端就能得到Access-Control-Allow-Origin=*;
而此时,nginx设置的headers信息就需要注释掉,不然存在多重重复头信息,也会报错。

Credentials是用与COOKIE校验的,如果要设为true,则进行如下配置
responce.set(‘Access-Control-Allow-Origin’, request.get(‘origin’));
但是这样,'Access-Control-Allow-Origin’拿到的就不是*,而是每个访问端的专属Origin。

此外,我个人对跨域一直存在误解,比如那个兄弟跟我说/api/sms有跨域限制,于是我用postman\浏览器测试了该接口(项目已经部署在服务器中,我这里的测试也属于远程调用),发现没有跨域问题,而且正常返回了ACCESS_CONTROL_ALLOW_ORIGIN:"*"。
新手大概看不出来这有什么问题,这就是对跨域的误解。

我以为项目部署在远程,地址是121.123.123.8,而我的本机地址是142.11.32.11(瞎写的,突出不一致),于是我就以为这就是跨域访问了,毕竟地址都不一样了。
然而,跨域的含义不是这样,跨域是指“在同一个页面中协议、域名、端口三者存在不一致”,我一直突出协议、域名、端口不一致,忽略了最关键条件“在同一个页面中”,因此凡是单接口请求一般是测不出跨域的,postman、浏览器等其他接口测试工具是没有跨域问题的,他们根本就没有页面差异或者说根本没有页面概念。

前后端之所以有跨域问题,是因为前端也是运行在一个http容器里面的,整过前端项目的都知道,运行项目的时候也是通过localhost:8080进行访问的,这就是“当前页面url”。
如果在其中请求localhost:8081下的一个接口,此时就是“同一个页面中端口不一致”,就发生了跨域。

另外,有大佬说postman的较新版本是模拟前端环境进行测试的,因此跨域也是可以测出来的(也有另一个大佬说postman不存在跨域问题)水平有限,具体的我也没测出来。


更新

本来好好的,结果前端同学依旧发生了跨域,而nginx配置正常。

整了一整天,最终终于解决。

在nginx对OPTIONS请求进行额外处理:
在这里插入图片描述
在跨域过程中(PUT、DELETE、发送JSON数据请求),会先发送一次预检OPTIONS请求,然而不知道为什么OPTIONS没有通过上图所示红框的上半部分(印象中OPTIONS似乎为了节省资源,省略了很多东西,所以可能没有执行该部分)

顺便提供一下其他相关资料。

忽略掉OPTIONS请求:
在这里插入图片描述
大佬参考的文章

阮一峰跨域详解,强推


推荐阅读
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文深入解析了Linux系统中常用的文件和目录操作命令,包括但不限于`ls`、`cd`等。通过详细讲解每个命令的功能、语法及应用场景,帮助读者掌握这些基本工具的使用方法,提升在Linux环境下的操作效率。此外,文章还介绍了如何结合选项和参数来实现更复杂的文件管理任务,为初学者提供了丰富的实践示例和技巧。 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
author-avatar
波波微博1987_704
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有