什么叫跨域
协议+ip/域名+端口,只要有其中一个不同都称之为“异源”,都可以叫跨域 cross orgin,跨域是浏览器认为从其他站点调用资源是视为不安全的,所有就提示一个跨域错误。
*在ajax get方式请求其他站点发生跨域现象,解决方案: 本质 通过将回调函数发给服务器
只能针对$.ajax() type="get" dataType="jsonp"
$.ajax({
url:http://localhost:/login.do
data:{itemId:$scope.sku.id,num:$scope.nu},
dataType:jsonp
type:get
success:function(response){},
error:function(){}
})
这样写,浏览器就会发送的url:http://localhost/login.do?callback=success()
localhost:8080服务器接收到该callback参数 ,然后就接口执行的结果放入到callback中拼接返回浏览器。
return callback+"("+数据+")"
ajax post方式发生的跨域现象,无法解决
*针对所有跨域现象,通用的解决方案(cors解决方案): 本质是通过设置头信息,告诉浏览器调用其他站点资源是安全的
访问跨域请求时
'http://localhost:8080/login.do.do?username=' + $scope.username + '&num=' + $scope.num, { 'withCredentials': true }
后台可以手动设置响应头
//路径为要访问此方法的服务器路径
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
response.setHeader("Access-Control-Allow-Credentials", "true");
//Access-Control-Allow-Origin: 允许访问的域 该字段必须携带
//Access-Control-Allow-Credentials: true 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie 如果要是cookie上面的域一定是具体的
设置允许所有站点访问,即可解决所有跨域请求
或者在方法上加入以下注解
//origins表示访问此方法的地址,allowCredentials表示允许携带cookie
@CrossOrigin(origins="http://localhost:8080",allowCredentials="true")