Proxy

164 阅读2分钟

什么是跨域?

首先分析一个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,返回的结果当然肯定根据你的代理服务器不同有所不同。