Node.js跨域解决方案,让你吃透(妈妈级教学)

简介: Node.js跨域解决方案,让你吃透(妈妈级教学)

一. 跨域的概念

同一时间,一个页面存在访问多个主机的情况,且每个主机之间,协议,主机,端口其中之一不相同。


同源策略:


两个主机,如果是协议,主机或域名,端口,其中之一不一样,就违反了同源策略


同源策略的限制:


不能发送ajax请求

不能跨域操作DOM等

不能跨域操作本地存储(cookie,localstorage,sessionstorage)

同源策略的产生最初是为了预防XSS和CSRF跨域脚本攻击。


二.跨域请求分类

1.简单跨域请求


请求类型:只支持GET,HEAD,POST

内容类型: x-www-urlencode,form-data,text/plain

请求只发一次

2.非简单跨域请求,范围比简单跨域请求更大


请求类型都支持

内容类型都支持

请求发两次,第一次是OPTIONS类型的请求,用于验证服务端是否允许跨域,如果允许,再发第二个请求,第二次就会发送数据。

三.JSONP方式解决跨域问题

client客户端:


<script>
//;handlejsonp({"name":"jsonp"})
function handlejsonp(data){
    console.log(data);
}
</script>
<script 
type="text/javascript"
src="http://localhost:3000/jsonp?callback=handlejsonp">
</script>

api服务端:

router.get('/jsonp', async (ctx, next) => {
  let cb = ctx.query.callback||"callback";
  let param = {name:"jsonp"};
  //";"+cb+JSON.stringify(param);
  //模板字符串
  let jp = `;${cb}(${JSON.stringify(param)})`;
  //设置响应头,告诉浏览器这是一个js脚本内容
  ctx.type="text/javascript"
  ctx.body = jp;
})

四.CORS解决方案

CORS跨域资源共享,只需要在后端设置3个基本响应头,就可以允许跨域

客户端:

<script>
    //发送简单请求
    function sendEasyAjax(){
    let req = new XMLHttpRequest();
    req.open("GET","http://localhost:3000/json");
    req.onreadystatechange=function(){
        if(req.status==200&&req.readyState==4){
            console.log(req.responseText);
        }
    }
    req.send();
}
sendAjax();
//发送非简单请求
function sendAjax(){
    let req = new XMLHttpRequest();
    req.open("POST","http://localhost:3000/noeasy");
    req.onreadystatechange=function(){
        if(req.status==200&&req.readyState==4){
            console.log(req.responseText);
        }
    }
    let jsonParam = 
        JSON.stringify({"classname":"jy001","classcount":36});
    req.send(jsonParam);
}
</script>

服务端只需要在app.js入口文件中设置:

app.use(async (ctx, next) => {
  ctx.set("Access-Control-Allow-Origin","*");
  ctx.set("Access-Control-Allow-Headers","Content-Type,Authorization");
  ctx.set("Access-Control-Allow-Methods","OPTIONS,GET,POST");
  //对OPTIONS类型的请求,直接返回成功状态即可,
  //因为它只是用于验证是否支持跨域
  if(ctx.method=="OPTIONS"){
    ctx.status=200;
    return;
  }
  //记得加上next()否则请求流程会中断
  await next();
})

最后

如果对您有帮助,希望能给个👍评论收藏三连!image.png

博主为人老实,无偿解答问题哦❤


相关文章
|
19天前
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
78 0
|
19天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
374 1
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的教学管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的教学管理系统附带文章源码部署视频讲解等
54 8
|
22天前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。
|
2月前
|
前端开发 JavaScript
node反向代理,解决跨域(http-proxy-middleware)
使用node.js和http-proxy-middleware库实现反向代理,解决跨域问题,允许前端请求通过代理访问不同端口的服务。
83 3
|
2月前
|
JavaScript 前端开发
js防抖函数返回值问题解决方案
本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。
24 1
|
2月前
|
存储 前端开发 JavaScript
node中循环异步的问题[‘解决方案‘]_源于map循环和for循环对异步事件配合async、await的支持
本文探讨了在Node.js中处理循环异步操作的问题,比较了使用map和for循环结合async/await处理异步事件的差异,并提供了解决方案。
32 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的教学仪器设备销售网站附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的教学仪器设备销售网站附带文章源码部署视频讲解等
35 1
|
3月前
|
JavaScript 调度
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
55 0
|
5月前
|
Dart JavaScript 前端开发
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
2714 1