当前位置:网站首页>跨域问题的分析
跨域问题的分析
2022-08-03 09:59:00 【snail-jie】
前言
在发布数据埋点工程后,前端访问时发生了跨域错误。经过问题分析排查发现,Kong网关里没有允许OPTIONS请求导致跨域错误。通过这个问题再对CORS原理梳理一下,知其所以然。
CORS原理分析
- 浏览器同源策略阻止跨域请求(请求1和请求2不一致)
- 浏览器和服务器使用HTTP头传递跨域请求的行为方式(下图来自cors-in-cation)
2.1 XMLHttpRequest对象将包含一个withCredentials属性,是否为true检查浏览器是否支持CORS
2.2 浏览器收到响应后,检查响应头Access-Control-Allow-Origin,判断服务器是否允许跨域请求。如果请求无效,浏览器将记录错误到控制台,然后触发XMLHttpRequest’onerror事件(找前端搞个页面验证一下)
prefligt request(预检请求)
在某些情况下,仅Access-Control-Allow-Origin 响应头是不够的,对服务器有特殊要求的非简单请求(比如PUT或DELETE方法,或者Content-Type字段的类型是application/json),需要在正式请求前增加一次预检请求
同时满足以下两个条件,就是简单请求(否则为非简单请求)
2.1 请求方法是以下三种方法之一:HEAD、GET、POST
2.2 HTTP的头信息不超出以下几种字段:
(1)Accept
(2)Accept-Language
(3)Content-Language
(4)Last-Event-ID
(5)Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain浏览器通过预检请求来请求权限,预检请求是浏览器在实际请求之前发送的一个小请求。包含使用哪种HTTP方法以及是否存在任何自定义HTTP头信息
项目跨域配置
- springboot后台配置跨域过滤器:CorsFilter
@Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); final CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); }
- 因为对于非简单请求会发预检请求,所以网关路由要允许OPTIONS方法通过(自己因为没配,导致一直报跨域错误)
束语
留意日常工作中的每一个bug,问题驱动在调式代码时会更有方向感,在排查问题时多反思,可以有很多收获。这里因为时间问题(还要好多需求没写),只问了自己既然有Access-Control-Allow-Origin响应头,为什么还要发送预检请求?其实可以接着问问自己为什么非简单请求就要发送预检请求呢?等等,有时间继续学习
边栏推荐
猜你喜欢
随机推荐
Promise 1: Basic Questions
索引(三)
2022年山东省安全员C证复习题模拟考试平台操作
Ultra-detailed Asp.net uses SSL two-way authentication, one article is enough
自动化测试浏览器驱动下载版本对应关系
流水线设计的方法和作用「建议收藏」
超详细的Asp.net使用SSL双向认证,一篇就够了
The simplest base64 image stream in js realizes automatic download
MySQL——几种常见的嵌套查询
json格式的字符串是什么类型的_输入字符串的格式要求
MySQL的分页你还在使劲的limit?
MySQL中的视图、索引以及事务的简单使用
使用GBase 8c数据库的时候,遇到这种报错“[[email protected] ~]$ /home/gbase/script/gha_ctl install -p……
函数指针数组
milvus
chrome F12 network 保留之前请求信息
js函数防抖和函数节流及其使用场景。
几款永久免费内网穿透,好用且简单_内网穿透平台
Go Redis database operation
慢 SQL 分析与优化