SpringBoot进阶之处理跨域问题(CORS)
SpringBoot进阶之处理跨域问题(CORS)前言
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫 适合人群学完Java基础 想通过Java快速构建web应用程序 想学习或了解SpringBoot
「大佬可以绕过 ~」 背景
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获 ~ 情景回顾
上期带大家学习了 Springboot 中如何集成MyBatis分页插件PageHelper 以及它的一个基本使用, 本期将带大家学习SpringBoot 中如何处理跨域问题的,同样的,我们集成到Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码 往期内容我的博客 Springboot入门 Springboot基础(一) Springboot基础(二) Springboot基础(三) Springboot基础(四) Springboot基础(五) SpringBoot进阶之缓存中间件Redis SpringBoot进阶之MyBatis分页插件 项目源码(持续更新 )springboot-all 什么是跨域
同样的,为了照顾小白同学,依然先说一下啥是跨域。说到跨域问题,如果你是 前端 同学,肯定不会陌生, 你有可能调接口调着调着,发现请求发布出去,控制台会报CORS 错误, 这时候你会找后台老大哥给你处理一下。然而现在前端工程中,一般都会有proxy代理 ,这样也能解决问题,这只是本地调试,但上线还会有问题, 除非你发布的时候你们是同一个域 下。
好,说了这么多,大概明白跨域是如何产生了,就是说前端调用的后端接口不属于同一个 域(域名或端口不同) ,就会产生跨域问题,也就是说你的应用访问了该应用域名或端口之外的域名或端口,这里给大家总结一下,产生跨域的三个条件: 宿主环境 在浏览器端,这是浏览器的一种保护机制,这个并不是服务端的限制,可以试试postman 和自己写一个html 调试一下 请求地址 的域名或端口和当前 (页面打开的地址)访问的域名或端口不一样 发送的是 XHR (XMLHttpRequest)请求 解决思路
解决思路大致可以分为以下几方面: 浏览器端
从源头浏览器解决,解除跨域机制,用户自己设置浏览器,这不大现实,好, pass JSONP请求替代XHR
发送 JSONP 请求替代XHR请求,并不能适用所有的请求方式,不推荐 请求代理
之前我们提到前端本地工程开启 Proxy ,那么服务端可不可进行代理呢?答案是可以的,怎么做?可以通过nginx 进行代理,给大家简单演示一下: server { listen 80; server_name www.a.com; root html; index index.html index.htm; location /api { proxy_pass http://www.b.com; // 转发地址 } }
nginx 是当今比较火的web 服务器,常用于服务代理, 等教大家部署的时候会讲一下 服务端处理
这也是本节要讲的内容,我们先不直接的给大家展示代码,先说一下它的原理。
一般我们下载的浏览器比如 Chrome ,它都是自行默认开启跨域限制 的,那我们如何判断我们发出去的请求是一个跨域请求 呢,打开浏览器开发者工具,在请求的请求头中就可以发现,如果不是一个跨域请求,它只有Host ,如果是一个跨域请求 它会多一个Origin ,告诉浏览器我俩请求的地方不一样 那么服务端是如何处理的呢?
跨源资源共享(CORS) 是一种基于 HTTP头 的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口 ),这样浏览器就可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的预检(OPTION) 请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头,那么具体是怎么设置头 的呢? # 设置允许访问的域 * 代表所有 Access-Control-Allow-Origin" : "*" # 设置允许请求者发送的请求头 "Access-Control-Allow-Headers": "*" # 设置允许请求者发送的请求方法 多个用逗号隔开,上面也是如此 Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS
服务端通过设置如上,就可以进行跨域访问了。好,有了基本的理论之后,我们一起看一下在 Springboot 中如何解决的: @Configuration public class GlobalCorsConfig { /** * 允许跨域调用的过滤器 */ @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); //允许白名单域名进行跨域调用 config.addAllowedOrigin("*"); //允许跨越发送cookie config.setAllowCredentials(true); //放行全部原始头信息 config.addAllowedHeader("*"); //允许所有请求方法跨域调用 config.addAllowedMethod("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
是不是很简单~ 它的实现机制主要是通过请求 拦截器 实现的,你慢慢会发现,随着学习的深入,你会遇到各种拦截器 技术 结束语
本期到这里就结束了,总结一下,本节主要带大家认识了什么是 跨域 ,以及解决思路,最后教大家Sprinboot 中是如何配置跨域访问的,源码已更新,大家可以自行试一下 下期预告
俗话说没有仪表盘的车不敢开,同样的,服务器没有日志记录,被攻击了都不知道。log对于问题的溯源是非常重要的, 下期将带大家学习一下如何在 Springboot 中配置日志以及如何开启sql 日志,我们将学习到logback 的配置。我们下期不见不散, 关注我,不迷路 ~
美国继续封堵中国购买光刻机在中科院把不用光刻机也可以生产芯片的论文,由口条生产力变成真实生产力之前,中国仍然需要重金购买这种现在地球上最复杂的机器。在制造采用7nm及以下制程的芯片时,正常的操作中必须使用极
陈明永在科技大会上讲了什么?一文让你读懂OPPO的商业思考在OPPO未来科技大会2020期间,OPPO创始人兼首席执行官陈明永做出了重要发言,并首次对外阐释了科技为人,以善天下的品牌信仰。并且正式阐明了OPPO的科技创新选择致善式创新,与
最牛风投合肥模式的多元科技投融资体系原创萌哥券商直投社区什么是合肥模式?简单来讲,合肥模式就是以股权投资风险投资的思维做产业导入,以投行的方式做产业培育。即成立市场化运作的产业投资基金,服务于招商引资战略性产业。善于
上汽通用汽车累计产销突破2000万辆8月12日,上汽通用汽车迎来了累计产销突破2000万辆的历史性时刻,再次刷新了中国汽车行业发展的速度纪录。成立23年来,上汽通用汽车始终坚持以客户为中心以市场为导向,以卓越的产品和
上汽大众销量回暖大众领跑单一品牌销量冠军2020年9月8日,乘联会发布的统计显示,8月份,上汽大众零售销量为14。4万辆,环比上涨4。89批售量达到14。5万辆,环比上涨8。21,批零售皆位列国内狭义乘用车市场第二位。新
榜单2020年8月中国市场最畅销的十大车型8月,中国车市迎来自2018年5月以来最强增长。随着疫情影响逐渐消退,汽车市场持续恢复。8月份国内狭义乘用车市场销量达170。3万辆,同比增长8。9,环比增长6。5实现了自2018
新车推荐高合HiPhiX,一款定义未来的豪华汽车01hr华人运通历时三年打造的高合汽车迎来破晓时分。9月24日,高合HiPhiX创始版正式上市,全球首款可进化的超跑SUV,相当程度上满足了国人对中国品牌高端汽车的想象。与此同时,
北京车展聊品牌,斯柯达125岁的年轻人2021款柯珞克北京车展首发并开启预售。01hr9月26日,北京车展开幕当天,上汽大众斯柯达2021款柯珞克,正式首发亮相并启动预售,其为车展特别打造的金色涂装令人眼前一亮。与此同
汉EV第2万辆新车下线,月产能将突破万台11月12日,在比亚迪深圳工厂,全球超安全智能新能源旗舰轿车汉EV迎来第20000辆新车下线。汉车型单月产能即将突破万台大关。比亚迪股份有限公司副总裁兼乘用车事业群COO何志奇现场
光荷ID。4X三地开箱新车亮点全解析11月4日晚,上汽大众ID。CUBE开箱仪式在珠海日月贝上海环球港北京世贸天阶三地同步举行。上汽大众正式公布其中文名光荷4X。光是指创见之光,新车自从设计之初就意在以光为核心,创造
斯柯达生产的第一款汽车,距今115年了斯柯达汽车的前身LaurinKlement公司(简称LK)生产的第一辆汽车VoituretteA诞生于1905年。这是一款轻型双座汽车,非常易于驾驶,最高时速40公里小时。当时,这