同源策略
现在普遍前后端分离,前端 http://ip:port/context 后端http://ip:anotherport/anothercontext ,然后你发现浏览器提示跨域了。或者你是前端或者后端。你们ip不一样,端口一样 ,前端调用后端接口依然提示跨域了。是不是很郁闷?这个跨域是什么玩意儿呢?简单来说如果两个页面的协议,端口(如果有指定)和主机都相同,则两个页面具有相同的源 。
这张图 会让你明白什么时候是同源,什么时候不同源,不同源如果要进行交互就需要跨域。至于为什么要限制,浏览器策略说是为了安全限制,具体原因可以去MDN 了解。本文不讨论。我们只讨论如何跨域。
跨域的方式
a.简单请求
(1) 请求方法是以下三种方法之一:
(2)HTTP的头信息不超出以下几种字段:
b.非简单请求
非简单请求会发出一次预检测请求,返回码是204,预检测通过才会真正发出请求,这才返回200。这里通过前端发请求的时候增加一个额外的headers来触发非简单请求。额外的请求头参数有
spring mvc中的cors跨域
以上就是跨域方式的简单介绍,这里我们着重介绍cors这种现代的操作方式,以及在spring mvc中如何设置cors。
使用@CrossOrigin注解 这种最为简单。该注解的属性值跟上面的非简单请求需要的的header参数一一对应,也可以不设置。使用起来也最简单,就像下面的操作:
上面是方法级别的控制粒度。在上面的示例中,CORS仅对canCors()方法启用。如果该控制器下所有的方法都要跨域,而且我们也可以指定一些参数。
这样CorsApi下所有的方法都将支持从 https://api.com 的跨域操作。使用@CrossOrigin的方式虽然简单。但是我们不可能不厌其烦的进行这种操作。如果我们能指定一些通配符方式的来指定那些操作可以cors就好了,当然有下面我们来看看全局配置。
WebMvcConfigurer 是我们的老朋友了,什么过滤器,格式化器,各种视图转换器,各种处理器都是它来注册的,就是一个Spring mvc 的配置中心。通过Ant风格的路径和Cors参数配置我们就可以全局来使用了不再需要注解支持。这种是javaConfig的玩法。如果是老式SSM 那种xml方式该这样玩
简单原理流程
通过 注解或者全局配置的CORS请求会被自动分发到各种已经注册的HandlerMappings(spring mvc 概念),然后由跨域处理器 CorsProcessor 接口(默认实现为DefaultCorsProcessor)来处理CORS预检请求(注意前面非简单的CORS请求介绍),然后拦截器CorsFilter拦截实际的具体请求,添加相关的CORS Headers (例如Access-Control-Allow-Origin),从而实现跨域请求。
总结
我们从跨域的概念到多种cors跨域方式的简单介绍,后面重点介绍了springmvc中CORS的注解方式,全局方式(包括javaConfig方式和xml方式),也讲述了简单的原理流程。相信对于目前前后端分离开发方式还是非常有指导意义的。