浏览器的同源策略会限制不同源的服务器之间通过XMLHttpRequest或者Fetch之间访问资源,使用JSONP可以解决这个问题,但是也是有局限性的,它只针对GET请求有效。目前的解决方法可以在服务端使用CORS可以达到这个目的。
首先我们先知道,当发生CORS通讯时,会有两种不同的情况
- 简单请求。当发生简单请求时,会在请求消息头里多一个Origin字段,响应消息头会增加一个Access-Control-Allow-Origin字段
- 非简单请求。当发生非简单请求时,请求服务器会先发起一个预检请求,这时请求方法时OPTION,响应服务器方会检查Origin,Access-Control-Request-Method,Access-Control-Request-Headers字段的数据,在得到响应服务器方允许之后,才能正式发起XMLHttprequest请求。
以下是使用Springboot时,针对CORS做的小demo.
请求方代码:
server.port: 8080
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>请求服务器方</title>
</head>
<script src="jquery-1.8.3.min.js"></script>
<body>
<button id="button" onclick="get()">提交</button>
</body>
<script type="text/javascript">
function get(){
$.get('http://localhost:8081/test/getSys/1',function(msg){
$("#button").html(msg);
});
}
</script>
</html>
响应服务器方代码:
server-port: 8081
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")//允许跨域访问的路径
.allowedOrigins("*")//允许跨域访问的源
.allowedMethods("*")//允许请求的方法
.maxAge(16000)//预检间隔时间
.allowedHeaders("*")//允许头部设置
.allowCredentials(true);//是否发送cookie
}
}
最后效果: