SpringBoot进阶之处理跨域问题(CORS)前言 大家好,一直以来我都本着用最通俗的话理解核心的知识点,我认为所有的难点都离不开基础知识的铺垫适合人群学完Java基础想通过Java快速构建web应用程序想学习或了解SpringBoot 大佬可以绕过背景 如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot基础部分,对基本的使用有了初步的认识,接下来的几期内容将会带大家进阶使用,会先讲解基础中间件的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获情景回顾 上期带大家学习了Springboot中如何集成MyBatis分页插件PageHelper以及它的一个基本使用,本期将带大家学习SpringBoot中如何处理跨域问题的,同样的,我们集成到Springboot中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码往期内容我的博客Springboot入门Springboot基础(一)Springboot基础(二)Springboot基础(三)Springboot基础(四)Springboot基础(五)SpringBoot进阶之缓存中间件RedisSpringBoot进阶之MyBatis分页插件项目源码(持续更新)springbootall什么是跨域 同样的,为了照顾小白同学,依然先说一下啥是跨域。说到跨域问题,如果你是前端同学,肯定不会陌生,你有可能调接口调着调着,发现请求发布出去,控制台会报CORS错误,这时候你会找后台老大哥给你处理一下。然而现在前端工程中,一般都会有proxy代理,这样也能解决问题,这只是本地调试,但上线还会有问题,除非你发布的时候你们是同一个域下。 好,说了这么多,大概明白跨域是如何产生了,就是说前端调用的后端接口不属于同一个域(域名或端口不同),就会产生跨域问题,也就是说你的应用访问了该应用域名或端口之外的域名或端口,这里给大家总结一下,产生跨域的三个条件:宿主环境在浏览器端,这是浏览器的一种保护机制,这个并不是服务端的限制,可以试试postman和自己写一个html调试一下请求地址的域名或端口和当前(页面打开的地址)访问的域名或端口不一样发送的是XHR(XMLHttpRequest)请求解决思路 解决思路大致可以分为以下几方面:浏览器端 从源头浏览器解决,解除跨域机制,用户自己设置浏览器,这不大现实,好,passJSONP请求替代XHR 发送JSONP请求替代XHR请求,并不能适用所有的请求方式,不推荐请求代理 之前我们提到前端本地工程开启Proxy,那么服务端可不可进行代理呢?答案是可以的,怎么做?可以通过nginx进行代理,给大家简单演示一下:server{listen80;servernamewww。a。com;roothtml;indexindex。htmlindex。htm;locationapi{proxypasshttp:www。b。com;转发地址}} nginx是当今比较火的web服务器,常用于服务代理,等教大家部署的时候会讲一下服务端处理 这也是本节要讲的内容,我们先不直接的给大家展示代码,先说一下它的原理。 一般我们下载的浏览器比如Chrome,它都是自行默认开启跨域限制的,那我们如何判断我们发出去的请求是一个跨域请求呢,打开浏览器开发者工具,在请求的请求头中就可以发现,如果不是一个跨域请求,它只有Host,如果是一个跨域请求它会多一个Origin,告诉浏览器我俩请求的地方不一样那么服务端是如何处理的呢? 跨源资源共享(CORS)是一种基于HTTP头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器就可以访问加载这些资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的预检(OPTION)请求。在预检中,浏览器发送的头中标示有HTTP方法和真实请求中会用到的头,那么具体是怎么设置头的呢?设置允许访问的域代表所有AccessControlAllowOrigin:设置允许请求者发送的请求头AccessControlAllowHeaders:设置允许请求者发送的请求方法多个用逗号隔开,上面也是如此AccessControlAllowMethods,PUT,POST,GET,DELETE,OPTIONS 服务端通过设置如上,就可以进行跨域访问了。好,有了基本的理论之后,我们一起看一下在Springboot中如何解决的:ConfigurationpublicclassGlobalCorsConfig{允许跨域调用的过滤器BeanpublicCorsFiltercorsFilter(){CorsConfigurationconfignewCorsConfiguration();允许白名单域名进行跨域调用config。addAllowedOrigin();允许跨越发送cookieconfig。setAllowCredentials(true);放行全部原始头信息config。addAllowedHeader();允许所有请求方法跨域调用config。addAllowedMethod();UrlBasedCorsConfigurationSourcesourcenewUrlBasedCorsConfigurationSource();source。registerCorsConfiguration(,config);returnnewCorsFilter(source);}} 是不是很简单它的实现机制主要是通过请求拦截器实现的,你慢慢会发现,随着学习的深入,你会遇到各种拦截器技术结束语 本期到这里就结束了,总结一下,本节主要带大家认识了什么是跨域,以及解决思路,最后教大家Sprinboot中是如何配置跨域访问的,源码已更新,大家可以自行试一下下期预告 俗话说没有仪表盘的车不敢开,同样的,服务器没有日志记录,被攻击了都不知道。log对于问题的溯源是非常重要的,下期将带大家学习一下如何在Springboot中配置日志以及如何开启sql日志,我们将学习到logback的配置。我们下期不见不散,关注我,不迷路