SpringBoot 跨域配置
CORS 跨域资源共享 如何解决跨域问题
跨域配置
为什么要跨域
- 跨域只存在于浏览器端,不存在于安卓 /ios/Node.js/python/java 等其它环境
- 跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
- 之所以会需要配置跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。
配置跨域的方式(CORS 跨域资源共享)
1 使用 SpringBoot 的注解 @CrossOrigin
1 |
|
2 添加一个配置类
继承 WebMvcConfigurerAdapter
或者实现 WebMvcConfigurer
注意
allowCredentials(true)
设置为 true 时,``allowedOrigins不能使用 * 需要替换为
.allowedOriginPatterns (“*”)` (这是一个允许使用通配符的模式列表。)
1 | import org.springframework.context.annotation.Configuration; |
3 在过滤器中进行配置(Filter
)
CORS Header 属性 | 解释 |
---|---|
Access-Control-Allow-Origin | 允许指定的域发起跨域请求。例如,可以设置为 http://www.example.com,则只有来自 http://www.example.com 的请求才会被接受。如果设置为 *,则表示接受任何域的请求。 |
Access-Control-Max-Age | 设置预检请求的结果能够被缓存多久。例如,如果设置为 86400,则表示在 86400 秒内,同样的请求不需要再发送预检请求,可以直接使用上一次的预检请求的结果。 |
Access-Control-Allow-Methods | 设置允许跨域请求的方法。例如,可以设置为 POST, GET, PUT, DELETE, OPTIONS,则表示这些 HTTP 方法的请求都会被接受。 |
Access-Control-Allow-Headers | 设置允许跨域请求包含的头部信息。例如,可以设置为 content-type,则表示允许跨域请求包含 content-type 头部信息。如果设置为 *,则表示接受任何头部信息。 |
Access-Control-Allow-Credentials | 设置是否允许发送 Cookie。如果设置为 true,则表示允许发送 Cookie。注意,如果允许发送 Cookie,那么 Access-Control-Allow-Origin 不能设置为 *,必须指定具体的域名。 |
1 | package com.wcx.blog.BlogBackend.config; |
拦截器与跨域的冲突
- 当你使用 1 2 两种方式配置跨域并且使用了拦截器,你的拦截器可能会直接拦截了你的请求导致跨域失败。
- 具体来说来 CROS 复杂请求时会首先发送一个 OPTIONS 请求做嗅探,来测试服务器是否支持本次请求,请求成功后才会发送真实的请求;而 OPTIONS 请求不会携带任何数据,导致这个请求不符合我们拦截器的校验规则被拦截了,直接返回了状态码,响应头中也没携带解决跨域需要的头部信息,进而出现了跨域问题。但是使用过滤器我们可以对这个 OPTIONS 请求进行识别,规避这种问题的出现。
== 所以使用拦截器后一般使用过滤器进行跨域配置 ==