持续创作,加速成长!这是我参与「日新计划 6 月更文挑战」的第8天,点击查看活动详情

跨域产生的原因首先是受浏览器的安全性设计影响,由于浏览器同源策略的设计,所以产生了跨nginx重启域。

在项目中,我们常常遇到跨域的问题,虽然在你approach的项目里,脚手架已经100%做好了本地代理、或者运维老铁在nginx中也已经给你做了接nginx是干嘛用的appetite代理,所以你遇到跨前端和后端的区别域的概率会少了很多,但是在传统的项目中,在那个jquery的横行时代,或者你接手了一个祖传项目时,跨域问题会是时有发生,本文只做笔者了解跨域的通用解决方案,希望在实际项目中对你有些思考和帮助。

正文开始…

何为同源

  • 协议相同
  • 域名相同
  • 端口相同

非同源是无法彼此访问cookie,dom操作ajaxlocalSto运维工程师需要掌握什么技能rageindexDB操作

但是非同源可以访问以下一些属性

window.postMessage();
window.location
window.frames
window.parent
...

对于非同前端是什么工作源网站跨域通信,我们可以采用以下几种方案

片段标识符nginx面试题

通过在url上放入#type,利用hashchange事件,获取父页面的nginx面试题相关hash数据

//parent
consttype='list';
constoriginUrl=originUrl+'#'+type;
constiframe=document.getElementById('iframe');
iframe.src=originUrl;

在子iframe中,我们可以监听hashchange事件

//iframe
window.addEventListener('hashchange',(evt)=>{
console.log(evt)//获取片段标识符的相关数据
})

跨文前端工程师档通信 window.postMessage

子页面可以利用window.postMessage向父页面发送信息,父页面监听message接收子页面发送的消息,通常这种方式在iframe通信中用application得做多,也是跨域通信的一种解决方案

//parent
window.addEventListener('message',(evt)=>{
constdata=evt.data;
console.log(data)
})
//child
constorigin='*';//这里一般是父页面的域名,但是也可以是*
constdata={
text:'hello,world'
};
window.postMessage(data,origin)

jsonp

利用script标签,向服务端发送一个get请求,url上绑定一个callback=fn,这个fn通常是与后端约束好,fn是客户端执行的函数名。

用一个简单的例子来解释下jsonp

客户端示例

<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metahttp-equiv="X-UA-Compatible"content="IE=edge">
<metaname="viewport"content="width=device-width,initial-scale=1.0">
<title>jsonp</title>
</head>
<body>
<h3>jsonp</h3>
<divid="app"></div>
<script>
varscript=document.createElement('script');
script.setAttribute('type','text/javascript');
script.src='http://192.168.31.40:8080/api?callback=jsonp';
document.body.appendChild(script);
constrenderHtml=({name,age},dom)=>{
dom.innerHTML=`<div>我的名字${name},今年${age}岁了</div>`
}
functionjsonp(data){
console.log(data);
constapp=document.getElementById('app');
const{name,age}=data;
renderHtml({name,age},app)
}
</script>
</body>
</html>

服务端示例代码

//server.js
consthttp=require('http');
constfs=require('fs');
constpath=require('path');
constPORT='8080';
constserver=http.createServer((req,res)=>{
res.statusCode=200;
//console.log(req.url);
res.setHeader('Content-Type','text/html');
fs.readFile(path.resolve(__dirname,'../','index.html'),(err,data)=>{
if(err){
res.end('404');
return;
}
res.end(data);
});
constdata={
name:'Maic',
age:Math.floor(Math.random()*20)
}
if(req.url.includes('/api')){
res.end(`jsonp(${JSON.stringify(data)})`)
}
});
server.listen(PORT,()=>{
console.log('serverisstart'+PORT);
})

注意我们安全教育手抄报看到有这样的一段判断req.url.includes('/api'),然后我们res.end(jsonp(JSON.string前端ify(data))),返回的就是jsonp这个回调函数,把数据当形参传给前端,在客户端定义的jsonp方法就能获取对应的数据。

执行node server.js打开http://localhost:8080我们会发现

常用的跨域解决方案
返回的数据就是fn({name: 'xx',age: 'xx'})

我们看下请求头

常用的跨域解决方案
浏览器会发送一个get请求,所携带的参数就是callback: jsonp,而我们在客户端确实是通过jsonp这个方法拿到对应的数据了。

所以我们可以知道jsonp实际上就是利用一个客户前端工程师端发送的get请求携带一个后端服务的返回的回调函数,在客户端,nginx重启我们定义这个回调函数就可以获取后端返回的形运维是什么意思参数据了。

jsonp这种跨域通信来看,其实有apple也它的缺点和优点

  • 缺点

1、它运维宝的安全appstore性会有一定风险,因为依赖的结果就是那个回调函数的形前端开发需要掌握什么技术参内容,如果被人劫持修改返回数据,那可能会造成安全性问题

2、仅支持get请求,不支持其它http请求方式,我们发现jsonp这种通信就是利用script标签请求了一个url,url上携带了一个可执行的回调函数,进而通前端和后端哪个工资高过后端给回调函数传递数据的。

3、没有任何状态码,运维是什么意思数据丢给客户端,如果有失败情况,不会有像http状态码一样

  • 优点

能解决跨域通信问题,兼容性比较好,不受同源策略的影响,安全期计算器对后端来说实现也简单。

在以前比较久远的项目中,你可能是直安全期计算器接使用jqueryj前端面试题sonpok了,大概的代码就是长这样的

$.ajax({
url:'xxx',
dataType:'jsonp',
jsonp:'successCallback',
success:(data)=>{
console.log(data)
},
error:(err)=>{
console.log(err)
}
})

successCallback这个就是与服务端约束的回调函数,一般与服务端沟通一安全教育平台致就行,那么简单的jsonp就已经完成了,运维工程师前端不是感觉很简单呢?

WebSocket

由于WebSoapplecket不受同源策略的限制,因此WebSocket也是可以实现跨域通信的。这里就不举例子了,具体可以参考之前写的一篇浅谈websocket这篇文章

CORS跨域资nginx是干嘛用的源分享

这种方式是在服务端进行控制,允许任何资源请前端开发求。其实在浏览器端,即使跨域,还是会正常请运维是什么意思求,只是请求非同源环境的后端服务,浏览器禁止请求访问,更多可以参考这篇文章cors[1]

我们写个例子具体安全教育平台登录测试一下,在客户端加入这段代码

constsend=document.getElementById('send');
send.onclick=function(){
if(!window.fetch){
return;
}
fetch('http://localhost:8081/list.json')
.then((res)=>res.json())
.then((result)=>{
console.log(result);
constcontentDom=document.querySelector('.content');
renderHtml(result,contentDom);
});
};

服务端代码安全,我们nginx服务器新建一个APPindex2.js服务端代码,并执行node index2.js

consthttp=require('http');
constPORT='8081';
constserver=http.createServer((req,res)=>{
res.statusCode=200;
////console.log(req.url);
res.setHeader('Content-Type','application/json');
if(req.url.includes('/list.json')){
res.end(JSON.stringify({
name:'maic',
age:Math.ceil(Math.random()*20)
}));
}

});
server.listen(PORT,()=>{
console.log('serverisstart'+PORT);
})

我们注意到请求的端approve口是8081,打开8080页面

常用的跨域解决方案
点击按钮,发送fetch请求,我们发现浏览器报了这样你常常看到的跨域信息as been blocked by COnginx配置RS policy安全生产法: No 'Access-Control-Allow-Origin' header...,因为跨域了

紧接着我们在服务端设置下Access-Control-Allow-Origin: *

consthttp=require('http');
constPORT='8081';
constserver=http.createServer((req,res)=>{
res.statusCode=200;
////console.log(req.url);
res.setHeader('Content-Type','application/json');
res.setHeader('Access-Control-Allow-Origin','*');
if(req.url.includes('/list.json')){
res.end(JSON.stringify({
name:'maic',
age:Math.ceil(Math.random()*20)
}));
}
});
server.listen(PORT,()=>{
console.log('serverisstart'+PORT);
})

此时再次访问时,已经ok了

常用的跨域解决方案
常用的跨域解决方案
注意我们可以看下Response Headers

HTTP/1.1200OK
Content-Type:application/json
Access-Control-Allow-Origin:*
Date:Sun,01May202214:23:59GMT
Connection:keep-alive
Content-Length:24

Access-Con运维tr安全期计算器ol-Allow-Origin:*这是我们服务的设置响应请求头,设置允许所有域名请求。

因此cors跨域其实在服务端设置Access-Control-Allow-Origin: *也就完美的解决了跨域问题。

总结

  • 跨域产生的原因,主要受同源策略的影响,非同源环境,无法运维工程师需要掌握什么技能相互访问cookielocalStoragedom操作
  • 解决跨域的方案主要有片段标识符iframe通信postMessage,jsonpWebSocke安全教育平台作业登录tcornginx是干嘛用的s
  • 用具体实际例子深入了解几种跨域模式,比如jsonp,实际上是利用scrip前端学什么t发送一个get请求,在get请求的参数中传入一个可执行的回调函数,服务根据请求,将返回一个前端可执行的回调函数,并且将数据当成该回调函数的形参,在前端定义该回调函数,从而获取调函数传入的数据。
  • 用具体看到服务端设置cors,主要是在后端接口返回响应头里设置Access-Control-Allow-Origin:*允许所有不同源网站访问前端和后端,这种方法也是比较粗暴的解决跨域问题。
  • 本文示例代码code exam安全模式怎么解除ple[2]

最后,看完觉得有收获的,鼓励下作者,点个赞,在看,转发,收藏等于学会,专注前端开发需要掌握什么技术前端web技术,分享we安全生产法b技术,关注公众号运维工程师需要掌握什么技能Web技术学苑,好好学习,天天向上!

参考资料

[1] cors: www.wan安全教育平台登录入口gdoc.com/javascript/…

[2] code example: github.comAPP/maicFir/les…