什么是跨域?什么是同源策略?
参考
所谓同源是指协议、域名以及端口要相同。同源策略是基于安全方面的考虑提出来的
什么是CORS?(跨域源资源共享)
它是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,这是 JSONP 模式的现代版
JSONP 虽然能解决跨域但是有一个很大的局限性,那就是只支持 GET 请求
演示
首先需要两个springboot项目,一个消费服务,一个 提供服务
提供服务
//端口号—8080
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@PostMapping("/hello")
public String hello2() {
return "post hello";
}
}
消费服务
//端口号—8081
<html lang="en">
<head>
<meta charset="UTF-8">
<title>跨域</title>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<div id="app"></div>
<input type="button" onclick="btnClick()" value="get_button">
<input type="button" onclick="btnClick2()" value="post_button">
<script >
function btnClick() {
$.get('http://localhost:8080/hello', function (msg) {
$("#app").html(msg);
});
}
function btnClick2() {
$.post('http://localhost:8080/hello', function (msg) {
$("#app").html(msg);
});
}
</script>
</body>
</html>
消费端用ajax请求8080端口,会发生异常
解决
在需要跨域访问的服务上加上注解
@RestController
public class HelloController {
@GetMapping("/hello")
@CrossOrigin(value = "http://localhost:8081")
public String hello() {
return "hello";
}
@PostMapping("/hello")
@CrossOrigin(value = "http://localhost:8081")
public String hello2() {
return "post hello";
}
}
@CrossOrigin配置某一个方法接受某一个域的请求
再次请求: