==============================================================
浏览器的同源策略:阻止从一个域加载的脚本去获取另一个域上的资源
只要 协议 域名 端口 有任何的不同,都被当作是不同的域
浏览器console看到Access-Control-Allow-Origin就代表跨域了
@RestController @RequestMapping(value = "goodsSales") // 增加运行跨域注解 // {}里的域名是允许哪些域名跨域访问 // 协议 域名 端口号都需要写 80端口不需要写 // 这种只能单个控制器使用 需要全局跨域需要令行配置 @CrossOrigin(origins = {"https://localhost:8080"}) public class GoodsSalesController {
// origins 可以配置 * 表示所有 端口,域名,协议都可以请求,但是不安全不建议配 // maxAge 预检请求缓存 3600 秒 // 非简单请求put/delete 等会发送两次请求,一次预检请求一次时间请求 // maxAge是把第一次预检结果缓存起来,接下来的3600秒内就不需要再次预检直接发送实际请求,减轻压力 @CrossOrigin(origins = {"*"}, maxAge = 3600) public class GoodsSalesController {
配置完注解就可以跨域访问,本质上是在请求和响应中都有了说明
在请求的Request Header里加上了“Sec-Fetch-Mode: cors” 代表这是一个跨域访问
Response Header里的Vary这一行表示远程url允许跨域访问,浏览器就会把返回的结果解析,显示
如果没有配置跨域注解,那就没Vary这一行,浏览器就认为,该远程资源不允许被远程访问,即便在接口响应里得到了结果,浏览器也不会解析
<beans> <mvc:cors> <!-- path="/request/**" 表示远程域名访问到request为前缀的url上都会被这个策略进行管理--> <!-- allowed-origins 允许哪些域名访问--> <!-- max-age 预检请求缓存时间--> <mvc:mapping path="/request/**" allowed-origins="http://localhost:8080, http://localhost:8080" max-age="3600"/> </mvc:cors> </beans>
===================================================================