序言
在谈浏览器跨域请求之前,先和大家说下,浏览器的同源策略,
同源策略:指的是,同协议、同域名、同端口,正常如果这三个条件有一个不符浏览器都会阻止我们的请求响应,这里,可能有的小伙伴就要问了,我好想在正常使用浏览器时经常会通过一个网站,访问其他网站,这明显是违背同源策略的,是的没错,他们都是采用了跨域的解决方案,下面和大家简单谈下常见的跨域解决!
跨域解决方式大体有这么三种
一、前后端配合解决:
前后端配合解决跨域问题主要体现在数据的请求方式采用jsonp的方式,我们都知道,前端请求数据,后端经常以json的数据格式加以响应,那么json与jsonp的数据格式有什么差别呢,简单一句话“jsonp就是带有函数包裹的json”
例:
‘callback({“a”:10,“b”:20})’
即为后端的jsonp数据
jsonp的使用:
创建script标签,href中添加请求地址。
为防止每次触发事件都会添加script标签,配合onload事件,发送请求后移除script标签
function callback( res ){
console.log(res);
}
<?php
# 1. 接受前端发送过来的全局函数名;
$cb = $_GET["cb"];
# 2. 把json包裹进全局函数名调用之中;
echo $cb.'({"a":10,"b":20})';
?>
二、纯后端解决:
这个比较简单:只需在后端语言加上请求头的限制
<?php
header("Access-Control-Allow-Origin:*");
header("Access-Control-Request-Methods:GET, POST, PUT, DELETE, OPTIONS");
header('Access-Control-Allow-Headers:x-requested-with,content-type,test-token,test-sessid');
echo "hello world";
?>
后续通过 已经封装好的ajax发起请求
ajax({
url : "http://127.0.0.1/php/day26/04_CORS.php",
success : function(res){
console.log(res);
}
})
三、通过代理服务器解决:
已知通过服务器发起的跨域请求,浏览器不会被阻止
于是就想能不能请求服务器时是同源的,通过服务器向其他跨域地址发起请求可以吗?
答案显然是可行的:
一般有以下两个步骤:
1. 找到nginx服务器配置文件;
以服务器nginx为例
查找路径为:phpstudy_pro-Extensions-Nginx-conf-vhosts-localhost_80.conf
2. 进行代理配置;
location = /pxx {
proxy_pass https://apiv2.pinduoduo.com/api/gindex/subject/limited/goods;
}(填写想要请求跨域的地址)
3.配置完成后,切勿忘记重启服务器
总结:
今天和大家分享下,常见的解决跨域请求的几种方式,在前端开发过程中,解决跨域请求,显然是必不可少的,理解透彻,想必也是极好的!
最后,感谢阅读!与君共勉!