什么是跨域?
首先分析一个url: www.exmple.com:3000/path/to/tes…
其中:http://属于协议, www.example.com属于域名, :3000属于端口, /path/to/test.html属于请求路径, ?key1=value1&key2=value2属于请求参数, #SomewhereInTheDocument属于锚点。
只要协议、域名、端口三者中,有一个及以上不一致时,就属于跨域
proxy即代理的意思,通过代理去访问目标服务器,再将得到的结果返回给本地服务器,从而达到跨域的作用。实现的其实是一种反向代理
-
比如我的前端服务器(node环境)挂载在5500端口上,而后端提供给我的接口挂载在网关上,我将后端接口和网关都挂载在本地服务器上,比如网关挂载在8081端口,后端接口在8087端口。
-
此时我的前端需要调用后端接口,就需要访问网关(接口挂在网关上),由于前端服务器和网关的端口不相同,这种调用便是一种跨域(协议,域名,端口三者有一个不一样即为跨域),想直接访问就会报错:
如何用proxy代理解决跨域问题
需要node作为web服务器通过另一台http/https代理服务器发http或者https请求。
request模块
// 代理服务器 => 解决跨域问题
// a.html需要获取B服务器的资源,跨域
// 现在a.html访问本地代理A服务器,用A服务器去访问B服务器
// 然后B服务器返回数据给A服务器,然后返回给a.html
//request模块后端可以做网络请求
//request做网络请求 属于后端node再做网络请求 它不是ajax 因此它请求别人服务器的接口都没有跨域限制
var router=require("./router.js")
var request=require("request")
router.get("/api1/ajax1",(req,res)=>{
var url="https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00ZmCkcDlel8HDd856f9b9ccsVwsYD"
request(url,(n1,n2,data)=>{
res.end(data)
})
})
html:
<button onclick="load1()">请求新浪微博</button>
<script>
function load1() {
//ajax--
var xhr = new XMLHttpRequest() || new ActiveXObject("Microsoft.XMLHTTP")
// var url="https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00ZmCkcDlel8HDd856f9b9ccsVwsYD"
var url="http://192.168.6.60:8080/api1/ajax1"
xhr.open("GET", url, true)
xhr.send()
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var obj=JSON.parse(xhr.responseText)
// console.log(obj,xhr.responseText)
console.log(obj)
}
}
}
</script>
这样我们通过了指定代理服务器发出了https的请求,注意这里我们代理服务器的http协议,而不是https,返回的结果当然肯定根据你的代理服务器不同有所不同。