介绍
跨域
CORS
,全称是"跨域资源共享"(Cross-origin resource sharing)
当页面发出跨域请求时:
-
简单请求(先简单理解为正常的get/post吧):
浏览器将请求的地址添加到header的Origin
里面发送请求。接下来就看后台如何处理了。 -
非简单请求(姑且简单理解成
Content-Type:"application/json"
吧):
浏览器会先发个预检请求(preflight),也就是OPTIONS
请求。服务器返回是否许可访问和支持的请求方式,浏览器再决定是否发出请求。
更多原理可以看阮一峰的 跨域资源共享 CORS 详解
使用@CrossOrigin
注解
用法很简单,只需在controller或者方法上面添加注解即可。在controller上用表示整个controller下的方法都支持跨域
@Controller
public class HomeController {
@CrossOrigin
@RequestMapping("/")
public String Index() {
return "Index";
}
}
参数说明
origins
: 表示允许跨域的地址
前面的http(s)必须加,默认*
表示全部value
:origins
的别名allowedHeaders
: 在OPTIONS
请求中,返回的Access-Control-Allow-Headers
这个参数限定了客户端只能发送的header参数,不在此范围内浏览器阻止发出请求。默认*
exposedHeaders
: 对应Access-Control-Expose-Headers
该字段可选。CORS请求时,
XMLHttpRequest
对象的getResponseHeader()
方法只能拿到6个基本字段:Cache-Control
、Content-Language
、Content-Type
、Expires
、Last-Modified
、Pragma
。如果想拿到其他字段,就必须在Access-Control-Expose-Headers
里面指定。上面的例子指定,getResponseHeader('FooBar')
可以返回FooBar
字段的值。
(摘自: 跨域资源共享 CORS 详解)
methods
: 允许的请求方法,像get
,post
这些allowCredentials
: 对应Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送
Cookie
。默认情况下,Cookie
不包括在CORS请求之中。设为true
,即表示服务器明确许可,Cookie
可以包含在请求中,一起发给服务器。这个值也只能设为true
,如果服务器不要浏览器发送Cookie
,删除该字段即可。
(摘自: 跨域资源共享 CORS 详解)
-
maxAge
: 对应Access-Control-Max-Age
用来指定预检请求的有效期(秒),在有效期内不在发送预检请求直接请求。默认1800秒,即30分钟。
使用spring配置文件
这个适合用于全局的配置,对应的字段跟CrossOrigin
差不多。path
表示允许跨域的路径。
<mvc:cors>
<mvc:mapping path="/**" allowed-methods="*"/>
</mvc:cors>